对于同一行或同一列的点,不论如何交换都在同一行或同一列,而最终这n个点行和列各不相同,因此即要找到n个点,使得行和列不同
然后对于每一个1,将所在行和所在列连边,二分图能完全匹配那么就说明存在这种方案
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct ji{ 4 int nex,to; 5 }edge[40005]; 6 int E,t,n,x,ans,mat[405],vis[405],head[405]; 7 void add(int x,int y){ 8 edge[E].nex=head[x]; 9 edge[E].to=y; 10 head[x]=E++; 11 } 12 bool dfs(int k){ 13 if (vis[k])return 0; 14 vis[k]=1; 15 for(int i=head[k];i!=-1;i=edge[i].nex){ 16 int v=edge[i].to; 17 if ((!mat[v])||(dfs(mat[v]))){ 18 mat[v]=k; 19 return 1; 20 } 21 } 22 return 0; 23 } 24 int main(){ 25 scanf("%d",&t); 26 while (t--){ 27 scanf("%d",&n); 28 E=ans=0; 29 memset(mat,0,sizeof(mat)); 30 memset(head,-1,sizeof(head)); 31 for(int i=1;i<=n;i++) 32 for(int j=1;j<=n;j++){ 33 scanf("%d",&x); 34 if (x)add(i,n+j); 35 } 36 for(int i=1;i<=n;i++){ 37 memset(vis,0,sizeof(vis)); 38 ans+=dfs(i); 39 } 40 if (ans==n)printf("Yes "); 41 else printf("No "); 42 } 43 }