cogs660 矩阵游戏 二分图匹配
Posted Loser Of Life
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 矩阵游戏 二分图匹配的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1059: [ZJOI2007]矩阵游戏 [二分图][二分图最大匹配]
bzoj 1059: [ZJOI2007]矩阵游戏 二分图匹配