题目
洛谷P2756 飞行员配对方案问题
题目大意
一共有n个飞行员
前m个外籍飞行员,后(n-m)个则为英国飞行员
一个外籍飞行员与英国飞行员进行匹配,求最大配合数
思路
不难看出
本题考察匈牙利算法
本体真正意思是给定一个二分图
其左部点的个数为m
右部点的个数为(n-m)
求其最大匹配的边数
代码
#include<bits/stdc++.h>
#pragma G++ optimize(2)
#pragma G++ optimize("inline")
using namespace std;
int n,m,ans,id,h[105],match[105];
bool vis[105];
struct node{int v,ne;
}e[10005];
inline void add(int a,int b){e[++id]={b,h[a]},h[a]=id;
}
inline bool dfs(int u){for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(vis[v]){continue;}vis[v]=true;if(!match[v]||dfs(match[v])){match[v]=u;return true;}}return false;
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>m>>n;for(int a,b;;){cin>>a>>b;if(a==-1&&b==-1){break;}add(a,b);}for(int i=1;i<=m;i++){memset(vis,0,sizeof vis);if(dfs(i)){ans++;}}cout<<ans<<"\n";//与【模板】二分图最大匹配的区别for(int i=1;i<=n-m;i++){if(match[i+m]){cout<<match[i+m]<<" "<<i+m<<"\n";} }return 0;
}