hdu3829 Cat VS Dog(二分最大独立集)

来源:互联网 发布:王者荣耀嬴政模型优化 编辑:程序博客网 时间:2024/06/06 16:30

http://acm.hdu.edu.cn/showproblem.php?pid=3829


详解见:http://blog.csdn.net/niushuai666/article/details/7076116

写得很详细,很清楚

#include <iostream>#include <string.h>#include <map>#include <stdio.h>#include <math.h>#include <algorithm>#define INF 10000000#define MAXN 505using namespace std;int n,m,p;int line[MAXN];char like[MAXN][5],dislike[MAXN][5];bool mp[MAXN][MAXN],used[MAXN];bool find(int a){    for(int i=0;i<p;i++)    if(mp[a][i]&&!used[i]){            used[i]=1;        if(line[i]==-1||find(line[i])){            line[i]=a;            return true;        }    }    return false;}int hungry(){        int sum=0;        for(int i=0;i<p;i++) {            memset(used,0,sizeof(used));            if(find(i)) sum++;        }        return sum;}int main(){    while(scanf("%d%d%d",&n,&m,&p)!=EOF){        for(int i=0;i<p;i++) scanf("%s%s",like[i],dislike[i]);        memset(mp,0,sizeof(mp));        memset(line,-1,sizeof(line));        for(int i=0;i<p;i++)            for(int j=0;j<p;j++)                if(strcmp(like[i],dislike[j])==0||strcmp(dislike[i],like[j])==0)                        mp[i][j]=1;        int temp=hungry();        printf("%d\n",p-temp/2);    }//while    return 0;}


0 0