UVA1349(带权二分图最大匹配 --> KM算法模板)
UVA1349
题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小
解法:
对于带权的二分图的匹配问题可以用通过KM算法求解。
要求最大权匹配就是初始化g[i][j]为0,直接跑就可以;
要求最小权匹配就是初始化g[i][j]为-INF,加边的时候边权为负,最后输出答案的相反数。
因为要求每个点恰好属于一个圈,意味着每个点都有一个唯一的后继。 反过来,只要每个点都有唯一的后继,每个点一定属于某个圈。
唯一的是我们想到了二分图的概念,我们对于每个点,建立由u到v的二分图, 之后问题就转换成了二分图上的最小权完美匹配问题
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define MEM(a,x) memset(a,x,sizeof(a))
#define INF 0x3f3f3f3f
#define MAXN 100+10
using namespace std; struct KM {
int n;
int g[MAXN][MAXN];
int Lx[MAXN], Ly[MAXN];
int slack[MAXN];//记录距X匹配到Y点还需要多少权值
int match[MAXN];//记录每个X点匹配到的Y集中的点
bool S[MAXN], T[MAXN]; void init(int n) {
this->n = n;
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
g[i][j] = -INF;
//注意这里如果是求最大权值匹配和就赋值为0
//最小权值匹配和就是—INF
} void add_Edge(int u, int v, int val) {
g[u][v] = max(g[u][v], val);
} bool dfs(int i) {
S[i] = true;
for (int j = ; j < n; j++) {
if (T[j]) continue;
int tmp = Lx[i] + Ly[j] - g[i][j];
if (!tmp) {
T[j] = true;
if (match[j] == - || dfs(match[j])) {
match[j] = i;
return true;
}
}
else slack[j] = min(slack[j], tmp);
}
return false;
} void update() {
int a = INF;
for (int i = ; i < n; i++)
if (!T[i]) a = min(a, slack[i]);
for (int i = ; i < n; i++) {
if (S[i]) Lx[i] -= a;
if (T[i]) Ly[i] += a;
}
} void km() {
for (int i = ; i < n; i++) {
match[i] = -;
Lx[i] = -INF; Ly[i] = ;
for (int j = ; j < n; j++)
Lx[i] = max(Lx[i], g[i][j]);
}
for (int i = ; i < n; i++) {
for (int j = ; j < n; j++) slack[j] = INF;
while () {
for (int j = ; j < n; j++) S[j] = T[j] = false;
if (dfs(i)) break;
else update();
}
}
}
}Men; int main() {
int n;
while (scanf("%d", &n) == && n) {
Men.init(n);
REP(u, , n) {
int v;
while (scanf("%d", &v) && v) {
int w; scanf("%d", &w);
v--;
Men.add_Edge(u, v, -w);
}
} Men.km();
int ans = , flag = ;
REP(i, , n) {
if (Men.g[Men.match[i]][i] == -INF) {
//有未匹配到,就是不成功,因为题目要求的是完美匹配
flag = ;
break;
}
ans += Men.g[Men.match[i]][i];//累加权值
}
if (!flag) printf("N\n");
else printf("%d\n", -ans);//最后是输出的是负数
}
return ;
}
UVA1349(带权二分图最大匹配 --> KM算法模板)的更多相关文章
- 带权二分图最大匹配KM算法
二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...
- HDU 2255 奔小康赚大钱(带权二分图最大匹配)
HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...
- Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)
Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...
- SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)
题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围: 1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
- HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 牛客多校第五场 E room 二分图匹配 KM算法模板
链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...
- 51Nod 飞行员配对(二分图最大匹配)(匈牙利算法模板题)
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...
- 二分图最大匹配 Hopcroft-Karp算法模板
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> ...
随机推荐
- 为什么尽量不要使用Executors创建线程池
看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,通过源码分析禁用的原因. 线程池的优点 管理一组工作线程,通过线程池 ...
- Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration
cat displays the contents of a file at the command line copies or apppend text file into a document ...
- Spring学习笔记:使用Pointcut 和Advisor实现AOP
基础知识 在 Spring AOP 中,有 3 个常用的概念,Advices . Pointcut . Advisor ,解释如下: Advices :表示一个 method 执行前或执行后的动作. ...
- 使用jQuery的插件jquery.corner.js来实现圆角效果-详解
jquery.corner.js可以实现各种块级元素的角效果,以下为演示,详见jquery_corner.html中的注释部分,并附百度盘下载 jquery_corner.html代码如下: < ...
- apache工具
组件 功能介绍HttpClient 提供HTTP客户端与服务器的各种通讯操作. 现在已改成HttpComponentsIO io工具的封装.Lang3 Java基本对象方法的工具类包 如:String ...
- 1 Nginx + 12 Tomcat +2DB 实现2个程序负载均衡
根据真实生产环境 总结. 硬件:共计5台服务器 1台负载windows.2台业务windows.2台数据库linux 业务:运行两个程序,两个数据库 具体:63服务器安装 Nginx 做负载 :61 ...
- [HTML5] input标签 disable属性
<span>服务器名称:<input type="text" name="server_name" placeholder="服务器 ...
- lua 打印一个table的实现
print("-------------Test-----------------") local tb = {} function printProperties(t, csp) ...
- iOS开发基础--C语言简述(一)
先占个坑,回来再补 需要的运行环境,自行搜寻,工具不止一种,不详细叙述. C语言是一门非常重要的编程语言,与硬件底层直接相关,很多语言到最后的接口封装都会选择C语言,因而C语言一直很受欢迎,也务必掌握 ...
- Windows更改、自定义键盘功能键
为什么要改? 使用mac盘习惯之后回到Windows感觉实盘使用起来很是别扭,所以... 开始行动 新建一个.reg后缀的文件,文件名称随意,编辑输入一下内容:(以下内容是把键盘左侧的CTRL和ALT ...