hdu2444 判断二分图+最大匹配

来源:互联网 发布:郭靖黄蓉爱情知乎 编辑:程序博客网 时间:2024/05/22 00:45

用黑白染色判断二分图。

#include <cstdio>#include <cstring>#include <queue>using namespace std;struct node{    int u,v;};node edge[50000];int first[300],next[50000];int cc;int vis[300];int flag[300];int linker[300];inline void add_edge(int u,int v){    edge[cc].u=u;    edge[cc].v=v;    next[cc]=first[u];    first[u]=cc;    cc++;}int judge(int n){    queue<int> q;    int i;    for(i=1;i<=n;i++)        //有报告没有这句,我觉得是错的,因为如果图不连通的话 ,会有错误答案    {        if(vis[i]==-1)        {            q.push(i);            vis[i]=1;            while(!q.empty())            {                int u=q.front();                q.pop();                int j;                for(j=first[u];j!=-1;j=next[j])                {                    int v=edge[j].v;                    if(vis[v]==-1)                    {                        vis[v]=!vis[u];                        q.push(v);                    }                    else if(vis[v]==vis[u])                        return 0;                }            }        }    }    return 1;}bool dfs(int u){    int i;    for(i=first[u];i!=-1;i=next[i])    {        int v=edge[i].v;        if(!flag[v])        {            flag[v]=1;            if(linker[v]==-1||dfs(linker[v]))            {                linker[v]=u;                return true;            }        }    }    return false;}int match(int n){    int i;    int sum=0;    memset(linker,-1,sizeof(linker));    for(i=1;i<=n;i++)    {        if(vis[i]==1)        {            memset(flag,0,sizeof(flag));            if(dfs(i))                sum++;        }    }    return sum;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        int i;        memset(vis,-1,sizeof(vis));        memset(first,-1,sizeof(first));        memset(next,-1,sizeof(next));        cc=0;        for(i=0;i<m;i++)        {            int u,v;            scanf("%d%d",&u,&v);            add_edge(u,v);            add_edge(v,u);        }        int ans=judge(n);        if(ans==0)            printf("No\n");        else        {            int res=match(n);            printf("%d\n",res);        }    }    return 0;}


原创粉丝点击