二分图匹配。
发现:无论怎么交换,同一行的还是同一行,同一列的还是同一列的。
所以直接建图,跑匈牙利就好了
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define N 205 using namespace std; int pp[N],n,T,g[N][N],cnt; bool bo[N]; bool find(int x){ for(int i=1;i<=n;i++){ if(!bo[i]&&g[x][i]){ bo[i]=1; if(!pp[i]||find(pp[i])){ pp[i]=x; return 1; } } } return 0; } int main(){ scanf("%d",&T); while(T--){ cnt=0; memset(pp,0,sizeof pp); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&g[i][j]); for(int i=1;i<=n;i++){ memset(bo,0,sizeof bo); if(find(i))cnt++; } if(cnt==n)printf("Yes "); else printf("No "); } return 0; }