hdu1068

来源:互联网 发布:网络爬虫书籍推荐 编辑:程序博客网 时间:2024/04/30 09:25
/*
分析:
    1、二分图的最大独立集数 = 节点数(n)— 最大匹配数(m);
    2、由于这个题是集合内部的匹配(请注意~~~,题目可没有说,
凑成 romantic relation 一对儿的,一定是男&&女~),所以求出来
的是最大匹配数的两倍,所以ans=n-2*最大匹配数。
    题目没有出现:“给出1号的时候,1可以匹2;而给2的时候,2能
匹配的对象中牟有1”的情况,否则还得要我们自己把其补全,才能用
上面的思路呢。


    另外,也可以处理为:比如说让(1---2)和(2---1)的情况只有一
个,即1的对象有2,而2的对象没有1,那么这样得到的最大匹配数,
就是1倍的匹配数,就可以直接ans=n-最大匹配数了。
    但是,这儿显然还是求两倍的方便~


                                               2012-07-13
*/








#include"stdio.h"#include"string.h"struct A{int total;int mem[1111];}E[1111];int match[1111];int visit[1111];int DFS(int k){int i;for(i=0;i<E[k].total;i++){if(visit[E[k].mem[i]])continue;visit[E[k].mem[i]]=1;if(match[E[k].mem[i]]==-1 || DFS(match[E[k].mem[i]])){match[E[k].mem[i]]=k;return 1;}}return 0;}int main(){int n;int ans;int i,l;int a,b;char str[22];int temp;while(scanf("%d",&n)!=-1){memset(match,-1,sizeof(match));for(i=0;i<n;i++)E[i].total=0;for(i=0;i<n;i++){scanf("%s",str);a=0;for(l=0;str[l]!=':';l++){a*=10;a+=str[l]-'0';}scanf("%s",str);temp=0;for(l=1;str[l]!=')';l++){temp*=10;temp+=str[l]-'0';}while(temp--){scanf("%d",&b);E[a].mem[E[a].total++]=b;}}ans=0;for(i=0;i<n;i++){if(E[i].total==0)continue;memset(visit,0,sizeof(visit));ans+=DFS(i);}ans=n-ans/2;printf("%d\n",ans);}return 0;}


原创粉丝点击