hdu2768Cat VS Dog(最大独立集)

来源:互联网 发布:淘宝windows10激活码 编辑:程序博客网 时间:2024/04/28 09:49

这个题目就是把喜欢猫的和喜欢狗的分开,然后用结构体表示一下喜欢和讨厌,这个地方用的string,方便以后判断相等的地方,把喜欢猫里面不喜欢狗和喜欢狗的相比找一样的,或者喜欢猫里和讨厌猫相比找一样的,然后建边,求最大独立集就是总的点数-最大匹配数

#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int maxn=510;int cat_cnt,dog_cnt;int g[maxn][maxn];int linker[maxn];bool used [maxn];string s1,s2;struct node{    string love;    string hate;}cat[maxn],dog[maxn];bool dfs(int u){    for(int v=0;v<dog_cnt;v++)    {        if(g[u][v]&&!used[v])        {            used[v]=true;            if(linker[v]==-1||dfs(linker[v]))            {                linker[v]=u;                return true;            }        }    }    return false;}int hungry(){    int res=0;    memset(linker,-1,sizeof(linker));    for(int u=0;u<cat_cnt;u++)    {        memset(used,false,sizeof(used));        if(dfs(u))            res++;    }    return res;}//以上是二分图模板void init(){    //s1.clear();    //s2.clear();    cat_cnt=0;//这个地方需要每次重新赋初值    dog_cnt=0;    for(int i=0;i<maxn;i++)    {        cat[i].love.clear();        dog[i].love.clear();        cat[i].hate.clear();        dog[i].hate.clear();    }}int main(){    int n,m,p;    while(cin>>n>>m>>p)    {        init();        memset(g,0,sizeof(g));        for(int i=1;i<=p;i++)        {            s1.clear();            s2.clear();            cin>>s1>>s2;            if(s1[0]=='C')            {                cat[cat_cnt].love=s1;                cat[cat_cnt++].hate=s2;            }            else if(s1[0]=='D')            {                dog[dog_cnt].love=s1;                dog[dog_cnt++].hate=s2;            }        }        for(int i=0;i<cat_cnt;i++)            for(int j=0;j<dog_cnt;j++)        {            if(cat[i].hate==dog[j].love||cat[i].love==dog[j].hate)                g[i][j]=1;        }        int ans=hungry();        cout<<p-ans<<endl;       // cout<<ans<<endl;    }    return 0;}
0 0
原创粉丝点击