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 }

转载于:https://www.cnblogs.com/CHerish_OI/p/8504575.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值