洛谷 [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]);
	}
}
posted @ 2018-01-08 19:07  Mr_Wolfram  阅读(182)  评论(0编辑  收藏  举报