校赛网络赛部分题解

博客介绍了ACM竞赛中关于一对一配对问题的解决方案,提到了两种方法,一是利用二分最大权匹配的Kuhn-Munkres算法,二是通过最大费用最大流的方法。文章内容主要围绕这两种算法模板的应用展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A:一对一配对,两种解法,一种是用二分最大权匹配 km算法可解 ,二是用最大费用最大流,两种都是直接套算法的模板就可以了。

下面给出km的做法

/******************************************************
 * File Name:   fff.cpp
 * Author:      kojimai
 * Create Time: Thu 26 Mar 2015 08:20:59 PM CST
******************************************************/

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 35
#define MAX 0x3f3f3f3f
int len[FFF][FFF];
int sx[FFF],sy[FFF];
int lx[FFF],ly[FFF];
int match[FFF],n;

int bfs(int i) {
	sx[i] = 1;
	for(int j = 1;j <= n;j++) {
		if(!sy[j] && lx[i] + ly[j] == len[i][j]) {
			sy[j] = 1;
			if(!match[j] || bfs(match[j])) {
				match[j] = i;
				return 1;
			}
		}
	}
	return 0;
}

int km(int n) {
	for(int i = 1;i <= n;i++) {
		lx[i] = len[i][1];
		for(int j = 2;j <= n;j++)
			lx[i] = max(lx[i],len[i][j]);
	}
	memset(ly,0,sizeof(ly));
	memset(match,0,siz
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值