hdu3829 二分图最大独立集/思考建图

每个人喜欢某个动物,讨厌某个动物。

一个人只有喜欢动物在,讨厌动物不在才会开心

==

问减去一些动物最多可以让多少人开心

==

想到->对人建图

对于两个人,如果A讨厌的是B喜欢的,或者A喜欢的是B讨厌的,就A->B连边,表示互斥

求一遍最大匹配ans,因为一个人被拆成两个,所以(2*n-ans)/2就是最多开心人数

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,g[505][505],link[505],y[505];
 6 char s1[505][5],s2[505][5];
 7 int dfs(int u)
 8 {
 9   for (int i=1;i<=n;i++)
10     if (g[u][i]&&!y[i]){
11       y[i]=1;
12       if (!link[i]||dfs(link[i])){
13         link[i]=u;
14         return 1;
15       }
16     }
17   return 0;
18 }
19 int main()
20 {
21   int p1,p2,i,j,ans;
22   while (~scanf("%d%d%d",&p1,&p2,&n))
23   {
24     memset(g,0,sizeof(g));
25     for (i=1;i<=n;i++)
26       scanf("%s%s",s1[i],s2[i]);
27     for (i=1;i<=n;i++)
28       for (j=1;j<=n;j++)
29         if (strcmp(s1[i],s2[j])==0||strcmp(s2[i],s1[j])==0)
30           g[i][j]=1;
31     memset(link,0,sizeof(link));
32     ans=0;
33     for (i=1;i<=n;i++){
34       memset(y,0,sizeof(y));
35       if (dfs(i)) ans++;
36     }
37     printf("%d\n",n-ans/2);
38   }
39   return 0;
40 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829

posted on 2015-04-29 00:02  xiao_xin  阅读(355)  评论(0编辑  收藏  举报

导航