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

Posted CHerish_OI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

以上是关于bzoj1059: [ZJOI2007]矩阵游戏(二分图匹配)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1059 ZJOI2007 矩阵游戏

bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配

BZOJ 1059 [ZJOI2007]矩阵游戏 (二分图最大匹配)

bzoj1059 [ZJOI2007]矩阵游戏

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

BZOJ P1059 [ZJOI2007]矩阵游戏——solution