208.10.19【網絡流24題】【洛谷P2756】飛行員配對方案問題(二分圖最大匹配)

傳送門


解析:

可以發現,這是個匹配問題,而且在需要匹配的點顯然存在於兩個不同的集合中。

直接匈牙利跑一個二分圖最大匹配就行了。


代碼:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const

inline int getint(){
	re int num;
	re char c;
	while(!isdigit(c=gc()));num=c^48;
	while(isdigit(c=gc()))num=(num<<1)+(num<<3)+(c^48);
	return num;
}

cs int N=201;
int g[N][N],n,m;
int vis[N],idx;
int match[N];

inline bool find(int u){
	for(int re i=m+1;i<=n;++i){
		if(idx^vis[i]&&g[u][i]){
			vis[i]=idx;
			if(!match[i]||find(match[i])){
				match[i]=u;
				return true;
			}
		}
	}
	return false;
}

signed main(){
	m=getint();
	n=getint();
	int u,v;
	while(~scanf("%d%d",&u,&v)){
		if(u==-1||v==-1)break;
		g[u][v]=true;
	}
	int ans=0;idx=1;
	for(int re i=1;i<=m;++i,++idx)if(find(i))++ans;
	if(ans==0)return puts("No Solution!"),0;
	cout<<ans<<"\n";
	for(int re i=m+1;i<=n;++i){
		if(match[i]){
			cout<<match[i]<<" "<<i<<"\n";
		}
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章