BZOJ 1059: [ZJOI2007]矩阵游戏

2018-06-17 21:02:51来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

1059: [ZJOI2007]矩阵游戏

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 5612  Solved: 2707
[Submit][Status][Discuss]

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

Sample Output

No
Yes
【数据规模】
对于100%的数据,N ≤ 200

HINT

 

Source

 
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=200+5;
 4 struct node{
 5     int net;
 6     int to;
 7 }t[maxn*2*maxn*2];
 8 int head[maxn];
 9 int n,T,ans;
10 int a[maxn][maxn];
11 bool vis[maxn];
12 int whi[maxn],p[maxn],cnt;
13 
14 inline void add(int i,int j)
15 {
16     t[++cnt].to=j;
17     t[cnt].net=head[i];
18     head[i]=cnt;
19 }
20 
21 bool dfs(int x)
22 {
23     for(int i=head[x];i;i=t[i].net)
24     {
25         int v=t[i].to;
26         if(!vis[v])
27         {
28             vis[v]=true;
29             if(!whi[v]||dfs(whi[v]))
30             {
31                 whi[v]=x;
32                 return true;
33             }
34         }
35     }
36     return false;
37 }
38 
39 int main()
40 {
41     scanf("%d",&T);
42     while(T--)
43     {
44         ans=0;
45         memset(head,0,sizeof(head));
46         memset(whi,0,sizeof(whi));
47         scanf("%d",&n);
48         for(int i=1;i<=n;i++)
49         {
50             for(int j=1;j<=n;j++)
51             {
52                 scanf("%d",&a[i][j]);
53                 if(a[i][j])
54                     add(i,j);
55             }
56         }
57         for(int i=1;i<=n;i++)
58         {
59             memset(vis,false,sizeof vis);
60             if(dfs(i))
61                 ans++;
62         }
63         if(ans==n)
64             cout<<"Yes"<<endl;
65         else
66             cout<<"No"<<endl;
67     }
68     return 0;
69 }

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BZOJ 1854: [Scoi2010]游戏

下一篇:BZOJ [NOI2009]变换序列