二分图匹配。
发现:无论怎么交换,同一行的还是同一行,同一列的还是同一列的。
所以直接建图,跑匈牙利就好了
#include#include #include #include #include #define N 205using 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\n"); else printf("No\n"); } return 0;}