[洛谷]P2071 座位安排 (匈牙利算法 - 二分图最大匹配)

1:思路:(匈牙利算法(二分图最大匹配))

一个比较裸的二分图最大匹配。

2:几乎模板,不同的就是建边的问题:(解决方案)

不难发现是把每个人与希望坐的排数建一条边,但是因为一排有两个座位,所以就把每一排的两个座位拆成两个点,分别建边,再求最大匹配即可。

我把第 x 排的两个座位分别设为 x 和 x+i,然后直接向这两个点建边。

3:ACcode:

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=8e3+10,M=1e5+10;
int h[N],e[M],ne[M],idx;
bool vis[N];
int res,match[N],n,m,ans[N];
void add(int a,int b) {
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool find(int t) {
	for(int i=h[t]; i!=-1; i=ne[i]) {
		int j=e[i];
		if(!vis[j]) {
			vis[j]=true;
			if(match[j]==0||find(match[j])) {
				match[j]=t,ans[t]=j;
				return true;
			}
		}
	}
	return false;
}
void solve() {
	cin>>n;
	memset(h,-1,sizeof h);
	for(int i=1; i<=2*n; i++) {
		int a,b;
		cin>>a>>b;
	    add(a,i),add(a+n,i);//每排两个座位
	    add(b,i),add(b+n,i);
	}
	for(int i=1; i<=2*n; i++) {
		memset(vis,false,sizeof vis);
		if(find(i)) res++;
	}
	cout<<res<<"\n";
}
signed main() {


	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int tt=1;
	//cin>>tt;
	while(tt--) solve();
	return 0;
}
//3

over~

相关推荐
长不胖的路人甲5 小时前
二叉排序树(BST)Java 完整实现 + 删除思路详解
java·开发语言·算法
geovindu5 小时前
python: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·python·算法·搜索算法
长不胖的路人甲5 小时前
可达性分析法(根搜索算法)完整详解
java·jvm·算法
paeamecium5 小时前
【PAT甲级真题】- Kuchiguse (20)
数据结构·c++·python·算法·pat考试·pat
青山木5 小时前
Hot 100 --- 全排列
java·数据结构·算法·leetcode·深度优先
海兰5 小时前
【高速缓存】RedisVL 存储类型选择指南:Hash 与 JSON
人工智能·redis·算法·缓存·json·哈希算法
KaMeidebaby5 小时前
卡梅德生物技术快报|核酸适配体文库筛选:核酸适配体文库筛选全流程技术解析:NGS与AI辅助方案的设计与实践
前端·人工智能·物联网·算法·百度
数聚天成DeepSData6 小时前
CWRU轴承数据集官方入口与替代获取渠道(2025核实版)
算法
txzrxz6 小时前
拓补排序讲解
c++·算法·图论·排序
深圳市快瞳科技有限公司6 小时前
宠物行为识别:将日常行为转化为可量化的健康指标
人工智能·算法·计算机视觉·宠物