Description
小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏。矩阵游戏在一个N
*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的)。每次可以对该矩阵进行两种操作:行交换操作:选择
矩阵的任意两行,交换这两行(即交换对应格子的颜色)列交换操作:选择矩阵的任意行列,交换这两列(即交换
对应格子的颜色)游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑
色。对于某些关卡,小Q百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!!于是小Q决定写一个程
序来判断这些关卡是否有解。
Input
第一行包含一个整数T,表示数据的组数。接下来包含T组数据,每组数据第一行为一个整数N,表示方阵的大
小;接下来N行为一个N*N的01矩阵(0表示白色,1表示黑色)。
Output
输出文件应包含T行。对于每一组数据,如果该关卡有解,输出一行Yes;否则输出一行No。
Sample Input
2
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0
Sample Output
No
Yes
【数据规模】
对于100%的数据,N ≤ 200
Yes
【数据规模】
对于100%的数据,N ≤ 200
如果我们仔细想一下,无论我们怎么变化,同一行的点一直在同一行,同一列的点一直在同一列,那么我们的任务就变成了寻找有多少点是不同行并且不同列的。。
那么就是一个二分图匹配。。。。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 1000000000 13 #define maxn 200+5 14 #define maxm 200+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int read(){ 24 int x=0,f=1;char ch=getchar(); 25 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 26 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 int n,m,mp[maxn][maxn],v[maxn]; 30 bool book[maxn]; 31 bool match(int x){ 32 for1(i,n) 33 if(mp[x][i]&&!book[i]){ 34 book[i]=1; 35 if(!v[i]||match(v[i])){ 36 v[i]=x; 37 return 1; 38 } 39 } 40 return 0; 41 } 42 bool find(){ 43 for1(i,n){ 44 memset(book,0,sizeof(book)); 45 if(!match(i))return 0; 46 } 47 return 1; 48 } 49 int main(){ 50 //freopen("input.txt","r",stdin); 51 //freopen("output.txt","w",stdout); 52 m=read(); 53 for1(i,m){ 54 memset(mp,0,sizeof(mp)); 55 memset(v,0,sizeof(v)); 56 n=read(); 57 for1(j,n) 58 for1(k,n){ 59 mp[j][k]=read(); 60 } 61 if(find())printf("Yes\n"); 62 else printf("No\n"); 63 } 64 return 0; 65 }