HDU 2444 The Accomodation of Students 二分图匹配
题目来源:
- HDU
题意:
给出学生数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);
#endifint 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;
}