洛谷 [P2756] 飞行员配对方案问题
二分图匹配裸题
可以用匈牙利做,简单高效
输出具体的匹配路径时 ,直接输出match数组即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
int m,n,g[105][105],match[205],ans;
bool f[205];
bool hungarian(int u){
for(int i=1;i<=g[u][0];i++){
int v=g[u][i];
if(!f[v]){
f[v]=1;
if(!match[v]||hungarian(match[v])){
match[v]=u;
match[u]=v;
return 1;
}
}
}
return 0;
}
int main(){
m=init();n=init();
while(1){
int u=init(),v=init();
if(u==-1) break;
g[u][++g[u][0]]=v;
}
for(int i=1;i<=m;i++){
memset(f,0,sizeof(f));
if(hungarian(i)) ans++;
}
cout<<ans<<endl;
for(int i=1;i<=m;i++){
if(match[i]) printf("%d %d\n",i,match[i]);
}
}