码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2444(判二分图+最大匹配)

时间:2015-02-11 00:28:36      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

 

传送门:The Accomodation of Students

题意:有n个学生,m对相互认识的,问能否分成两队,使得每对中没有相互认识的如果可以求最大匹配否则输出No

分析:判断二分图用染色法,然后直接匈牙利算法求最大匹配。

技术分享
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 210
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define PII pair<int,int>
using namespace std;
int vis[N],match[N],color[N];
vector<int>g[N];
int dfs(int u)
{
    for(int i=0,sz=g[u].size(); i<sz; i++)
    {
        int v=g[u][i];
        if(!vis[v])
        {
            vis[v]=1;
            if(match[v]==-1||dfs(match[v]))
            {
                match[v]=u;
                return 1;
            }
        }

    }
    return 0;
}
int judge(int u,int fa,int state)
{
    color[u]=state;
    for(int i=0,sz=g[u].size(); i<sz; i++)
    {
        int v=g[u][i];
        if(v==fa)continue;
        if(color[v]&&color[u]==color[v])return 0;
        else if(!color[v]&&!judge(v,u,3-state))return 0;
    }
    return 1;
}
int main()
{
    int n,m,u,v;
    while(scanf("%d%d",&n,&m)>0)
    {
        FILL(g,0);
        FILL(match,-1);
        for(int i=1;i<=n;i++)g[i].clear();
        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }
        FILL(color,0);
        bool flag=true;
        for(int i=1; i<=n; i++)
            if(!color[i]&&g[i].size()>0)
            {
                if(!judge(i,i,1))
                {
                    flag=false;
                    break;
                }
            }
        if(!flag)
        {
            puts("No");
            continue;
        }
        int ans=0;
        for(int i=1; i<=n; i++)
        {
            FILL(vis,0);
            if(dfs(i))ans++;
        }
        printf("%d\n",ans/2);
    }
}
View Code

 

hdu2444(判二分图+最大匹配)

标签:

原文地址:http://www.cnblogs.com/lienus/p/4285157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!