您的位置:首页 > 其它

hdu3829-Cat VS Dog(最大独立集,匹配问题)

2017-11-15 13:29 246 查看

题目来源:http:///showproblem.?pid=3829

题意

动物园里,有好多小狗小猫,有那么一群孩子,他们分别有喜欢的动物和不喜欢的动物(必须种类不一样。),然后动物园要送走一些动物,那么如果送走了孩子不喜欢的动物,孩子会很开心,问最多能使得多少个孩子开心。。。

思路

哇,一看这题就蒙了。。(太菜太菜)

这道题其实是求最大独立集。怎么理解呢

两个孩子之间如果喜欢和不喜欢的刚好一样,哇,那么就产生了矛盾,那么反之,就可以不矛盾,如果我们把有矛盾的孩子赋予一定的关系,这个时候我题目就转化成了求没有关系的孩子们的最大集合,也就是最大独立集。。

由于依旧是对全图进行最大匹配,所以最大匹配结果要除以2,那么最大独立集合=节点个数-最大匹配。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=500+10;
int mp[maxn][maxn],pre[maxn],vis[maxn];
char like[maxn][10],dislike[maxn][10];
int n,m,k;

void init()
{
memset(like,0x00,sizeof(like));
memset(dislike,0x00,sizeof(dislike));
for(int i=1; i<=k; i++)
scanf("%s%s",like[i],dislike[i]);
}
void deal()
{
memset(mp,0,sizeof(mp));
for(int i=1; i<=k; i++)
{
for(int j=i+1; j<=k; j++)
{
if(strcmp(like[i],dislike[j])==0||strcmp(like[j],dislike[i])==0)
{
mp[i][j]=1;
mp[j][i]=1;
}
}
}
}
int dfs(int i)
{
for(int j=1; j<=k; j++)
{
if(mp[i][j]&&!vis[j])
{
vis[j]=1;
if(pre[j]==-1||dfs(pre[j]))
{
pre[j]=i;
return 1;
}
}
}
return 0;
}
void solve()
{
int ret=0;
memset(pre,-1,sizeof(pre));
for(int i=1; i<=k; i++)
{
memset(vis,0,sizeof(vis));
ret+=dfs(i);
}
printf("%d\n",k-ret/2);
}

int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
init();
deal();
solve();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: