hdu1068 Girls and Boys(二分匹配)
来源:互联网 发布:ubuntu安装fcitx五笔 编辑:程序博客网 时间:2024/05/01 04:29
//hdu 1068 二分匹配。//我们要求的是一个二分图的最大点独立集。//对于二分图而言,最大点独立集 = 总点数 - 最大匹配数(边最小覆盖)//集合内部的二分匹配,可以通过拆点进行扩展。//对于一个无法分清哪些点属于A,哪些点属于B的二分图。//可以考虑拆点,实际上就是把原来的二分图作了一个对称,//这两个二分图之间是相互独立的。//对于这个新的二分图,我们求出的最大匹配数是原来两个相同图的,所以要除以2;#include<cstdio>#include<cstring>using namespace::std;const int N = 10001;struct edge{ int u,v,next;}edge[N];int cnt=0;int head[N];void addedge(int u,int v){ edge[cnt].u=u;edge[cnt].v=v;edge[cnt].next=head[u];head[u]=cnt++;}struct Hungary{ int used[N],line[N]; void init(){ memset(line,-1,sizeof(line)); } bool find(int x){ for(int i=head[x];i!=-1;i=edge[i].next){ int v=edge[i].v; if(!used[v]){ used[v]=true; if(line[v]==-1||find(line[v])){ line[v]=x; return 1; } } } return 0; } int Max_match(int n){ int all=0; for(int i=0;i<n;i++){ memset(used,0,sizeof(used)); if(find(i))all+=1; } return all; }};Hungary huy;int main(){ int n; while(scanf("%d",&n)!=EOF){ int p,q,v; cnt=0; memset(head,-1,sizeof(head)); for(int i=0;i<n;i++){ scanf("%d: (%d)",&p,&q); for(int j=0;j<q;j++){ scanf("%d",&v); addedge(p,v); } } huy.init(); printf("%d\n",n-huy.Max_match(n)/2); } return 0;}
0 0
- 【二分匹配】HDU1068-Girls and Boys
- hdu1068 Girls and Boys(二分匹配)
- 二分匹配 HDU1068 Girls and Boys
- hdu1068(二分)Girls and Boys
- hdu1068 Girls and Boys(二分图)
- Hdu1068-Girls and Boys-【二分图】
- hdu1068 Girls and Boys
- HDU1068--Girls and Boys
- HDU1068:Girls and Boys
- HDU1068-Girls and Boys
- HDU1068 Girls and Boys
- Girls and Boys||HDU1068
- hdu1068 Girls and Boys
- hdu1068 Girls and Boys
- Girls and Boys (二分匹配)
- hdu1068 Girls and Boys (二分图最大独立集)
- HDU1068-Girls and Boys(二分图_最大独立集)
- 【图算法之二分图】HDU1068---Girls and Boys
- Q-CSMA
- JAXB学习之注解
- 指针——C的精华
- Python在windows下模拟按键和鼠标点击代码
- 常用代码段(一)删除List中的重复元素
- hdu1068 Girls and Boys(二分匹配)
- java正则匹配
- JAVA自动装箱拆箱以及装箱时的缓存问题
- [转载]Integer.parseInt()和这个Integer.valueOf()的详解
- memcpy函数介绍
- svg文件字符串读取到QPushButton上
- Multiply Strings
- Linux 之Cut命令详解
- 干货 IOS设备分辨率一览