[洛谷P1129] [ZJOI2007]矩阵游戏(二分图最大匹配—匈牙利)

题解见上一篇啦,这里是匈牙利算法版本。

#include
#include
const int N=210;
int T,n,map[N][N],rit[N];
bool flag,vis[N];
inline int read(){
	int x=0,f=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return f?-x:x;
}
bool find(int u){
	for(int i=1;i<=n;i++)
		if(map[u][i]&&!vis[i]){
			vis[i]=true;
			if(!rit[i]||find(rit[i])){rit[i]=u;return true;}
		}
	return false;
}
int main(){
	T=read();
	while(T--){
		n=read();
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)map[i][j]=read();
		memset(rit,0,sizeof rit);flag=true;
		for(int i=1;i<=n;i++){
			memset(vis,false,sizeof vis);
			if(!find(i)){flag=false;break;}
		} 
		if(flag)printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

 

你可能感兴趣的:(二分图)