UVA 12168 Cat vs. Dog(最大独立集)

来源:互联网 发布:sql中values什么意思 编辑:程序博客网 时间:2024/06/06 03:40

这个看的出来是求最大独立集,但是一开始一直是猫和狗矛盾,用毛和狗在做最大匹配。

但是题目要求是最多满足多少人的要求,才发现,是人的最大独立集。

#include<iostream>#include<cstring>using namespace std;const int maxn=500+5;bool line[maxn][maxn],used[maxn];int match[maxn],c,d;struct person{    int like,unlike;    person(int l=0,int ul=0): like(l),unlike(ul) {}}cat[maxn],dog[maxn];bool find(int i){    for(int j=1;j<=d;j++)    {        if(line[i][j]==true&&used[j]==false)        {            used[j]=true;            if(match[j]==-1||find(match[j]))            {                match[j]=i;                return true;            }        }    }    return false;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(line,false,sizeof(line));        memset(match,-1,sizeof(match));        int n,m,v;        scanf("%d%d%d",&n,&m,&v);        c=0,d=0;        char s1[5],s2[5];        for(int i=1;i<=v;i++)        {            scanf("%s%s",s1,s2);            int a=0,b=0;            for(int j=1;s1[j];j++) a=a*10+s1[j]-'0';            for(int j=1;s2[j];j++) b=b*10+s2[j]-'0';            if(s1[0]=='C') {cat[++c]=person(a,b);}            else {dog[++d]=person(a,b);}        }        for(int i=1;i<=c;i++)        {            for(int j=1;j<=d;j++)            {                if(cat[i].unlike==dog[j].like||cat[i].like==dog[j].unlike) line[i][j]=true;            }        }        int ans=0;        for(int i=1;i<=c;i++){            memset(used,false,sizeof(used));            if(find(i)) ans+=1;        }        printf("%d\n",v-ans);    }    return 0;}

0 0
原创粉丝点击