匈牙利爆零求调
查看原帖
匈牙利爆零求调
381706
EXnoLph楼主2022/7/23 16:32
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000008;
int to[maxn],nxt[maxn],head[maxn],vis[maxn],use[maxn];
int sc[maxn],bd[maxn];
int top;
void add(int now,int tow){
	to[++top]=tow;
	nxt[top]=head[now];
	head[now]=top;
}
bool dfs(int x){
	for (int i=head[x];i!=0;i=nxt[i]){
		int ver=to[i];
		if(!vis[ver]){
			vis[ver]=1;
			if(use[ver]==0||dfs(use[ver])){
				use[ver]=x;
				return 1;
			}
		}
	}
	return 0;
}
void init(){
		memset(vis, 0, sizeof(vis));
		memset(to, 0, sizeof(to));
		memset(nxt, 0, sizeof(nxt));
		memset(head, 0, sizeof(head));
		memset(use, 0, sizeof(use));
		memset(sc, 0, sizeof(sc));
		memset(bd, 0, sizeof(bd));
		top=0;
}
int main(){
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		int n, tot=0, ans=0, tmp;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>bd[i];
		}
		for(int i=1;i<=n;i++){
			cin>>sc[i];
			if(!bd[i]){sc[i]=0;tot++;}
			else if(!sc[i]){add(i,i);tot++;}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				cin>>tmp;
				if(tmp&&bd[j]){add(i,j);}
			}
		}
		for(int i=1;i<=n;i++){
			if(sc[i]){continue;}
			if(dfs(i)){ans++;}
		}
		if(tot==ans){cout<<"^_^"<<endl;}
		else{cout<<"T_T"<<endl;}
		init();
	}
}
2022/7/23 16:32
加载中...