HDU 2444 The Accomodation of Students(判断二分图&染色法)

来源:互联网 发布:21lic单片机项目外包网 编辑:程序博客网 时间:2024/06/05 21:11

题目大意:给定一些关系,问能有没有最大匹配。

思路:二分图匹配,用染色法判断奇环(因为二分图不会有奇环)

#include<map>#include<queue>#include<cmath>#include<iostream>#include<cstdio>#include<stack>#include<cstring>#include<algorithm>#define LL long long#define inf 0x3f3f3f3fconst double PI=acos(-1.0);using namespace std;struct node{    int to,next;}q[50000];int cnt,head[50000],cro[50000],col[50000];bool vis[50000];void bu(int a,int b){    q[cnt].to=b;    q[cnt].next=head[a];    head[a]=cnt++;}int dfs(int u){    for(int i=head[u];~i;i=q[i].next){        int v=q[i].to;        if(vis[v]) continue;        vis[v]=true;        if(cro[v]==-1||dfs(cro[v])){            cro[v]=u;            return 1;        }    }    return 0;}bool color(int x){    for(int i=head[x];~i;i=q[i].next){        int u=q[i].to;        if(!col[u]){            col[u]=!col[x];            if(!color(u))                return false;        }        else if(col[x]==col[u]){            return false;        }    }    return true;}int main(){    int n,m,i,j,k,a,b,ans;    while(~scanf("%d%d",&n,&m)){        cnt=ans=0;        memset(head,-1,sizeof(head));        memset(col,0,sizeof(col));        for(i=0;i<m;i++){            scanf("%d %d",&a,&b);            bu(a,b);bu(b,a);        }        //col[1]=1;        bool bj=false;        for(i=1;i<=n;i++){            if(!color(i)){                bj=true;break;                //puts("No");continue;            }        }        if(bj){            puts("No");continue;        }        memset(cro,-1,sizeof(cro));        for(i=1;i<=n;++i){            memset(vis,false,sizeof(vis));            ans+=dfs(i);        }        printf("%d\n",ans/2);    }    return 0;}
0 0
原创粉丝点击