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

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

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

#include<map>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
const 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;
}

你可能感兴趣的:(二分图)