hdu1068二分匹配

来源:互联网 发布:淘宝子账号怎么登录 编辑:程序博客网 时间:2024/05/21 06:39
#include <cstdio>#include <vector>using namespace std;#define SUCCESS 1#define FAIL -1vector<vector<int> > relation;int mark[500],flag[500];int allocatefor(int pos){    int newpos,i;    if(flag[pos]==0) return FAIL;    for(i=0;i<relation[pos].size();i++)        if(mark[relation[pos][i]]==-1)        {            mark[relation[pos][i]]=pos;            return SUCCESS;        }    for(i=0;i<relation[pos].size();i++)    {        newpos=mark[relation[pos][i]];        if(newpos==-2) continue;        mark[relation[pos][i]]=-2;        if(allocatefor(newpos)==SUCCESS)        {            mark[relation[pos][i]]=pos;            return SUCCESS;        }        mark[relation[pos][i]]=newpos;    }    flag[pos]=0;    return FAIL;}main(){    int n,m,id,i,j,temp,num;    while(scanf("%d",&n)!=EOF)    {        relation.clear();        relation.resize(n);        for(j=0;j<n;j++)        {            scanf("%d: (%d)",&id,&m);            for(i=0;i<m;i++)            {                scanf("%d",&temp);                relation[id].push_back(temp);            }        }        for(i=0;i<n;i++) mark[i]=-1;        num=0;        for(i=0;i<n;i++)        {            for(j=0;j<n;j++) flag[j]=1;            if(allocatefor(i)==SUCCESS) num++;        }        printf("%d\n",n-num/2);    }    return 0;}


原创粉丝点击