hdu 2768 Cat vs. Dog (最大独立集)
2015-05-13 21:01
429 查看
/* 题意:有v个观众,每个人投给自己喜欢的猫(或者狗)和讨厌的狗(或者猫),如果出现喜欢的和别人讨厌的相同,则其中一人会不满意。 现要求得是最大满意的观众是多少。 方法:根据出现矛盾的两个观众序号建边。现在选择最多的顶点,要求各个顶点之间没有线相连,即不出现矛盾。就是求最大独立集。 最大匹配:二分图G中,找出边数最大的子图M,使得M中各条边均无公共顶点,则M为最大匹配。可用匈牙利算法求得。 最大独立集,在二分图G中,找出点数最多的子图,使得M中各点之间都不相连。 最大独立集=顶点数n-最大匹配 */ # include <stdio.h> # include <vector> # include <algorithm> # include <iostream> # include <string> #include <string.h> using namespace std; int maxx; int v; int vis[510]; vector<int>g[510]; int map[510]; string a[510],b[510]; int find(int u)///判断增广路是否存在,匈牙利算法 二分匹配 { for(int i=0; i<g[u].size(); i++) { int v1=g[u][i]; if(!vis[v1]) { vis[v1]=1; if(!map[v1]||find(map[v1])) { map[v1]=u; return 1; } } } return 0; } int main() { int t,c,d; while(~scanf("%d",&t)) { while(t--) { scanf("%d%d%d",&c,&d,&v); memset(vis,0,sizeof(vis)); for(int i=1; i<=v; i++) g[i].clear(); for(int i=1; i<=v; i++) { cin>>a[i]>>b[i]; } for(int i=1; i<=v; i++) { for(int j=1; j<=v; j++) { if(a[i]==b[j]||b[i]==a[j]) { g[i].push_back(j); g[j].push_back(i); } } } int ans=0; memset(map,0,sizeof(map)); for(int i=1; i<=v; i++) { memset(vis,0,sizeof(vis)); ans+=find(i); } printf("%d\n",v-ans/2); } } return 0; }
相关文章推荐
- hdu 2768 Cat vs. Dog (最大独立集)
- hdu 2768 Cat vs. Dog 最大独立集
- hdu 2768 Cat vs. Dog 最大独立集(最大匹配)
- hdu 2768 Cat vs. Dog(最大独立集)
- 【HDU】2768 Cat vs. Dog 最大独立集
- HDU 2768 Cat vs Dog(最大独立集)
- HDU 2768 Cat vs. Dog 【二分匹配之最大独立集】
- HDU 2768 Cat vs. Dog 最大独立集+匈牙利算法(提高题)
- hdu 2768 Cat vs. Dog【最大独立集】
- hdu_2768 Cat vs. Dog 最大独立集
- hdu 2768 Cat vs. Dog 最大独立集
- HDU 3829 Cat VS Dog【最大独立集】
- hdu 3829 Cat VS Dog(最大独立集)
- Cat VS Dog HDU - 3829 最大独立集
- HDU--3829--Cat VS Dog【最大点独立集】
- HDOJ 2768 - Cat vs. Dog 构图解二分图的最大独立集
- [hdu 3829] Cat VS Dog(二分图最大独立集)
- hdu 3829 Cat VS Dog【最大独立集】
- hdu 2768 Cat vs. Dog(二分图最大匹配--最大独立点集)
- HDU 3829 Cat VS Dog(二分图最大独立集)