hdu 2768 Cat vs. Dog 最大独立集(最大匹配)
来源:互联网 发布:女朋友活好体验 知乎 编辑:程序博客网 时间:2024/06/06 03:21
#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <map>#include <string>#include <algorithm>#include <iostream>using namespace std;const int maxn=505;vector<int>e[maxn];int vis[maxn],pre[maxn];int find(int u)//判断增广路是否存在,匈牙利算法{ int i,j,v; for(i=0;i<e[u].size();i++) { v=e[u][i]; if(!vis[v]) { vis[v]=1; if(pre[v]==-1||find(pre[v])) { pre[v]=u; return 1; } } } return 0;}string a[maxn],b[maxn];int main(){ int c,d,v,T; cin>>T; while(T--) { cin>>c>>d>>v; int i,j,k; for(i=1;i<=v;i++) e[i].clear(); for(i=1;i<=v;i++) cin>>a[i]>>b[i]; for(i=1;i<=v;i++) for(j=1;j<=v;j++) if(a[i]==b[j]||b[i]==a[j]) { e[i].push_back(j); e[j].push_back(i); } memset(pre,-1,sizeof(pre)); int ans=0; for(i=1;i<=v;i++) { memset(vis,0,sizeof(vis)); ans+=find(i); } cout<<v-ans/2<<endl; } return 0;}/* 题意:有v个观众,每个人投给自己喜欢的猫(或者狗)和讨厌的狗(或者猫),如果出现喜欢的和别人讨厌的相同,则其中一人会不满意。现要求得是最大满意的观众是多少。 方法:根据出现矛盾的两个观众序号建边。现在选择最多的顶点,要求各个顶点之间没有线相连,即不出现矛盾。就是求最大独立集。 最大匹配:二分图G中,找出边数最大的子图M,使得M中各条边均无公共顶点,则M为最大匹配。可用匈牙利算法求得。 最大独立集,在二分图G中,找出点数最多的子图,使得M中各点之间都不相连。 最大独立集=顶点数n-最大匹配*/