您的位置:首页 > 其它

HDU3829 Cat VS Dog(最大独立集)

2016-05-17 17:13 239 查看
题意:

n个小孩,每个小孩喜欢一种动物讨厌一种动物

你是管理员,可以任意去掉一些动物

当小孩讨厌的动物被去掉并且喜欢的动物没有被去掉时,

他是开心的

问最多让多少小孩开心

思路:

让有矛盾的小孩建边,求最大独立集即可

/* ***********************************************
Author        :devil
Created Time  :2016/5/17 17:13:21
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
const int N=510;
int link
,c,d,n;
string s1
,s2
;
bool vis
;
vector<int>eg
;
bool dfs(int u)
{
for(int i=0;i<eg[u].size();i++)
{
int v=eg[u][i];
if(!vis[v])
{
vis[v]=1;
if(link[v]==-1||dfs(link[v]))
{
link[v]=u;
return 1;
}
}
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d",&c,&d,&n))
{
memset(link,-1,sizeof(link));
for(int i=1;i<=n;i++)
eg[i].clear();
for(int i=1;i<=n;i++)
cin>>s1[i]>>s2[i];
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(s1[i]==s2[j]||s1[j]==s2[i])
{
eg[i].push_back(j);
eg[j].push_back(i);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
ans+=dfs(i);
}
printf("%d\n",n-ans/2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: