NOJ [1305] Cat VS Dog

来源:互联网 发布:知乎live打包百度云 编辑:程序博客网 时间:2024/05/16 06:15
  • 问题描述
  • The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-animal and a dislike-animal, if the child's like-animal is a cat, then his/hers dislike-animal must be a dog, and vice versa.
    Now the zoo administrator is removing some animals, if one child's like-animal is not removed and his/hers dislike-animal is removed, he/she will be happy. So the administrator wants to know which animals he should remove to make maximum number of happy children.
  • 输入
  • The input file contains multiple test cases, for each case, the first line contains three integers N <= 100, M <= 100 and P <= 500.
    Next P lines, each line contains a child's like-animal and dislike-animal, C for cat and D for dog. (See sample for details)
  • 输出
  • For each case, output a single integer: the maximum number of happy children.


    最大独立集问题,今天刚触手,个人感觉难点在与二分图的连边,必须按题意来把边连出来

    #include<stdio.h>#include<string.h>#define maxn 505int n,m,p;bool vis[maxn];int match[maxn];char love[maxn][5],hate[maxn][5];struct edge{int num;//与某个顶点相连的顶点数目    int next[maxn];}mat[maxn];bool dfs(int x){for(int i=0;i<mat[x].num;i++){if(!vis[mat[x].next[i]]){vis[mat[x].next[i]]=true;if(match[mat[x].next[i]] == -1 || dfs(match[mat[x].next[i]])){match[mat[x].next[i]]=x;return true;}}}return false;}int hungary(){int tot=0;memset(match,-1,sizeof(match));for(int i=0;i<p;i++){memset(vis,0,sizeof(vis));if(dfs(i))tot++;}return tot;}int main(){while(~scanf("%d%d%d",&n,&m,&p)){char c,d;int i,j;getchar();for(i=0;i<maxn;i++)  mat[i].num=0;for(i=0;i<p;i++)scanf("%s %s",love[i],hate[i]);    for(i=0;i<p;i++)      for(j=i+1;j<p;j++)      {      if(!strcmp(love[i],hate[j]) || !strcmp(hate[i],love[j]))//某个人喜欢的恰好是另一个不喜欢的,产生矛盾,就连一条边{   mat[i].next[mat[i].num]=j;   mat[i].num++;   mat[j].next[mat[j].num]=i;   mat[j].num++;  }         }printf("%d\n",p-hungary()/2);}return 0;}


0 0