#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-最大匹配
*/
hdu 2768 Cat vs. Dog 最大独立集(最大匹配)
最新推荐文章于 2021-03-09 19:51:43 发布