cogs660 矩阵游戏 二分图匹配

填坑……链接:http://cogs.pro/cogs/problem/problem.php?pid=660

题意:给出一个矩阵,有黑白双色,问是否可以使主对角线全为黑色。

不能不说现在越来越垃圾了……眼看错误都看不出来……

这道题显然可以网络流瞎切,但是我们考虑到填坑向需求,所以我们用二分图做它。把每一行看做$x$节点,列看做$y$节点,每个黑节点看做一条边,目标便是每个$x$节点完成匹配。

然后……我菜翻了……神$TM$

 if(match[v]==-1||find(v)) 

大声告诉我我是不是$SB$!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=205;
 7 struct node
 8 {
 9     int from,to,next;
10 }edge[(maxn*maxn)<<1];
11 int head[maxn],tot;
12 void addedge(int u,int v)
13 {
14     edge[++tot]=(node){u,v,head[u]};head[u]=tot;
15 }
16 int match[maxn],n;
17 bool used[maxn];
18 int find(int x)
19 {
20     for(int i=head[x];i;i=edge[i].next)
21     {
22         int v=edge[i].to;
23         if(!used[v])
24         {
25             used[v]=1;
26             if(match[v]==-1||find(match[v]))
27             {
28                 match[v]=x;
29                 return 1;
30             }
31         }
32     }
33     return 0;
34 }
35 int haha()
36 {
37     freopen("qmatrix.in","r",stdin);
38     freopen("qmatrix.out","w",stdout);
39     int t;scanf("%d",&t);
40     while(t--)
41     {
42         tot=0;
43         memset(head,0,sizeof(head));
44         scanf("%d",&n);
45         for(int i=1;i<=n;i++)match[i]=-1;
46         for(int i=1;i<=n;i++)
47             for(int j=1;j<=n;j++)
48             {
49                 int x;scanf("%d",&x);
50                 if(x)addedge(i,j);
51             }
52         int cnt=0;bool meizhaodao=0;
53         for(int i=1;i<=n;i++)
54         {
55             memset(used,0,sizeof(used));
56             if(!find(i))
57             {
58                 meizhaodao=1;
59                 break;
60             }
61         }
62         if(meizhaodao)puts("No");
63         else puts("Yes");
64     }
65 }
66 int sb=haha();
67 int main(){;}
cogs660
原文地址:https://www.cnblogs.com/Loser-of-Life/p/7348642.html