HDU 2444 The Accomodation of Students 二分图匹配

时间:2022-12-18 06:00:03

HDU 2444 The Accomodation of Students 二分图匹配

题目来源:

题意:

给出学生数n和关系数m,接下来给出m个关系。
要求将学生分成两部分,每一部分不能有互相认识的人。做不到就输出"No"
若上一步满足,则将学生配对,要求这两个学生互相认识。

题解:

一个难点是建图,要求只是满足每一部分不能有认识的就好。
建完图直接二分图最大匹配输出结果就好。

代码:

#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n,m;
const int maxn=200+10;
vector<pair<int,int> >mp;
int G[maxn][maxn];
int matched[maxn];
int vi[maxn];
int l[maxn],r[maxn];

int dfs(int x)
{
    for(int i=0;i<maxn;i++)
    {
        if(G[x][i] && !vi[i])
        {
            vi[i]=1;
            if(matched[i]==-1||dfs(matched[i]))
            {
                matched[x]=i;
                matched[i]=x;
                return 1;
            }
        }
    }
    return 0;
}

int solve()
{
    int ans=0;
    memset(matched,-1,sizeof(matched));
    for(int i=0;i<maxn;i++)
    {
        memset(vi,0,sizeof(vi));
        ans+=dfs(i);
    }
    return ans;
}

int main()
{
#ifndef ONLINE_JUDGE
    //freopen("3.in","r",stdin);
    //freopen("3.out","w",stdout);
#endif
    int a,b;
    bool flag;
    while(cin >> n >> m)
    {
        flag=false;
        memset(l,0,sizeof(l));
        memset(r,0,sizeof(r));
        mp.clear();
        memset(G,0,sizeof(G));
        for(int i=0;i<m;i++)
        {
            cin >> a>> b;
            mp.push_back(make_pair(a,b));
        }
        for(int i=0;i<m;i++)
        {
            if((l[mp[i].first] && l[mp[i].second])||(r[mp[i].first]&& r[mp[i].second]))
            {
                flag=1;
                break;
            }
            l[mp[i].first]=1;
            r[mp[i].second]=1;
            G[mp[i].first][mp[i].second]=1;
        }
        if(flag)
            cout <<"No"<<endl;
        else
        {
            cout <<solve()<<endl;
        }
    }
    return 0;
}