题目
题目大意
一共有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;
}