/*
题意:有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 (最大独立集)
最新推荐文章于 2020-09-06 11:42:57 发布