每个人喜欢某个动物,讨厌某个动物。
一个人只有喜欢动物在,讨厌动物不在才会开心
==
问减去一些动物最多可以让多少人开心
==
想到->对人建图
对于两个人,如果A讨厌的是B喜欢的,或者A喜欢的是B讨厌的,就A->B连边,表示互斥
求一遍最大匹配ans,因为一个人被拆成两个,所以(2*n-ans)/2就是最多开心人数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }