洛谷P2756 飞行员配对方案问题

题目

洛谷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;
}
posted @   yzbyzb  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示