[洛谷1129] [ZJOI2007]矩阵游戏 {匈牙利算法}

题目

https://www.luogu.org/problemnew/show/P1129


解题思路

我们可以将这一行和黑色的列连边。
我们可以画图就可以发现,行列的变换不换改变二分图匹配的值。


代码

#include
#include
#include
#include
#define rr register 
using namespace std; 
int T,n,f[501][501],link[501],ans; bool b[501]; 
inline int read(){
	int f=0; char c=getchar(); 
	while(!isdigit(c)) c=getchar(); 
	while(isdigit(c)) f=(f<<3)+(f<<1)+c-48,c=getchar(); 
	return f; 
}
inline bool hungary(int x){
	for (int i=1;i<=n;i++) if (f[x][i]&&!b[i]){
		int u=link[i]; link[i]=x; b[i]=1; 
		if (!u||hungary(u)) return 1; link[i]=u; 
	}
	return 0; 
}
int main(){
	T=read(); 
	while (T--){
		memset(f,0,sizeof(f)); 
		memset(link,0,sizeof(link)); 
		n=read(); ans=0; 
		for (rr int i=1;i<=n;i++) for (rr int j=1;j<=n;j++)	f[i][j]=read(); 
		for (rr int i=1;i<=n;i++) memset(b,0,sizeof(b)),ans+=hungary(i); 
		if (ans==n) printf("Yes\n"); else printf("No\n"); 
	}
}

你可能感兴趣的:(匈牙利算法(二分图最大匹配))