二分图匹配。
补充,感觉之前说的不够详细,如果有完美匹配的话,每行都有一个对应的列,那么换来换去以后,对角线就全黑了。。。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 400 + 10; bool vis[maxn]; int p[maxn],map[maxn][maxn]; int n,T; bool find(int x) { if(vis[x]) return false; vis[x]=1; for(int i=1;i<=n;i++) if(map[x][i]) { if(!p[i] || find(p[i])) { p[i]=x; return true; } } return false; } bool work() { memset(p,0,sizeof(p)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(!find(i)) return false; } return true; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); if(work()) printf("Yes "); else printf("No "); } return 0; }