BZOJ1059_矩阵游戏_KEY
由题意可得,这道题是求使一些行上的1是否能两两不同行,两两不同列。
于是我们就可以把1点的i与j连边,做一遍二分图匹配。
如果每一行即i都可以匹配到,那么就有解。
code:
/************************************************************** Problem: 1059 User: yekehe Language: C++ Result: Accepted Time:360 ms Memory:1448 kb ****************************************************************/ #include <bits/stdc++.h> using namespace std; int T,a[201][201],n,tot,vis[201],wt[201],ans; bool find(int x){ for(int i=1;i<=n;i++){ if(!vis[i]&&a[x][i]){ vis[i]=1; if(!wt[i]||find(wt[i])){ wt[i]=x; return 1; } } } return 0; } int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); memset(wt,0,sizeof(wt)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); int ans=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); ans+=find(i); } if(ans==n)puts("Yes"); else puts("No"); } }