bzoj1059: [ZJOI2007]矩阵游戏(二分图匹配)

1059: [ZJOI2007]矩阵游戏

题目:传送门 

题解:

   为了赶上苏大佬的光速的脚步...刷了题水题,不过苏大佬好像一早就搞定了,所以也没有什么关系了对吧!

   其实说水题的话还不能完全算是,但如果要是发散一下思维很容易就精A:

   因为对于同一列或者同一行的棋子来说,不论如何变化,始终都在同一列或者同一行。

   那么如果能够组成对角线,那只要找到n个不能同行也不能同列的棋子就ok啊。

   再细想一下,解法就是公牛母牛配啊

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int f[1100];
 5 int n,m,ans;
 6 bool map[510][510];
 7 bool c[510];
 8 bool find_muniu(int x)
 9 {
10     for(int j=1;j<=n;j++)
11         if(map[x][j])
12             if(c[j]==true)
13             {
14                 c[j]=false;
15                 if(f[j]==0 || find_muniu(f[j]))
16                 {
17                     f[j]=x;
18                     return true;
19                 }
20             }
21     return false;
22 }
23 int main()
24 {
25     int T;
26     scanf("%d",&T);
27     while(T--)
28     {
29         scanf("%d",&n);
30         memset(map,false,sizeof(map));
31         for(int i=1;i<=n;i++)
32             for(int j=1;j<=n;j++)
33                 scanf("%d",&map[i][j]);
34         int ans=0;
35         memset(f,0,sizeof(f));
36         for(int i=1;i<=n;i++)
37         {
38             memset(c,true,sizeof(c));
39             if(find_muniu(i)==true)ans++;
40         }
41         if(ans<n)printf("No\n");
42         else printf("Yes\n");
43     }
44     return 0;
45 }
posted @ 2018-03-04 14:09  CHerish_OI  阅读(155)  评论(0编辑  收藏  举报