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算法模板)的更多相关文章

  1. 带权二分图最大匹配KM算法

    二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...

  2. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

  3. Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)

    Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...

  4. SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)

    题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围:  1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...

  5. "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)

    博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...

  6. HDU 1045 - Fire Net - [DFS][二分图最大匹配][匈牙利算法模板][最大流求二分图最大匹配]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1045 Time Limit: 2000/1000 MS (Java/Others) Mem ...

  7. 牛客多校第五场 E room 二分图匹配 KM算法模板

    链接:https://www.nowcoder.com/acm/contest/143/E来源:牛客网 Nowcoder University has 4n students and n dormit ...

  8. 51Nod 飞行员配对(二分图最大匹配)(匈牙利算法模板题)

    第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...

  9. 二分图最大匹配 Hopcroft-Karp算法模板

    #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> ...

随机推荐

  1. esp跟ebp跟踪记录

    发现文字描述还是太没有快感.上几幅图,来说明这个调试过程更好.此文对于深刻理解ebp,esp是具有长远意义的 可以看到,初始情况下,ebp此时值为0012FEDC,也就是栈帧的地址,而栈顶地址esp值 ...

  2. GetWindowRect与GetClientRect 的区别

    GetWindowRect 函数功能:该函数返回指定窗口的边框矩形的尺寸.该尺寸以相对于屏幕坐标左上角的屏幕坐标给出. 函数原型:BOOL GetWindowRect(HWND hWnd,LPRECT ...

  3. [css]画圆形标签

    画圆形标签的窍门: 圆形是在padding和margin中间同时是padding的内切圆也是margin的外接圆 .circle{ width: 20px; height: 20px; display ...

  4. Codeforces 1178E Archaeology (鸽巢原理)

    题意: 给你1e6的字符串,保证只含'a''b''c'三种字符,且相邻两个字符一定不一样 求一个大于等于n/2的回文子序列 思路: 朴素的最长回文子序列是n方的区间dp,这题显然不行,要充分利用题中所 ...

  5. 移植freertos到stm32 f103 的基本流程和总结

    为什么要在stm32 f103上面移植freertos   stm32 f103 以他的全面的文档,亲民的价格,强大的功能.成为无数微设备的方案首选.在市场上有极大的使用量.市场占有率也是非常的高.f ...

  6. Leetcode题解 - 部分中等难度算法题解(56、957、825、781、1324、816)

    957. N 天后的牢房 思路: 模拟变换,当N天结合后返回 => 当N非常大的时候,超时 => 一般N很大的时候,这种题目必然存在循环,所以记录找过的状态,一旦出现已经访问过的状态可立即 ...

  7. 【人类观察所】"当代人"正经历的生活

    一."即时满足"的互联网 "轻微烦躁,偶尔自燃,当代生活多数时刻的心情基调." 如果你出生于上个世纪,应该能明白木心的<从前慢>里的 「从前的日色变 ...

  8. 【转载】signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN)

    来源:https://blog.csdn.net/guotao1983/article/details/82118218 signal(SIGCHLD, SIG_IGN) 因为并发服务器常常fork很 ...

  9. C# 小游戏-拼图魔方【Game Puzzle】

    工作闲暇之余去逛了逛CodeProject,刚好现有项目主要用到就是winform,浏览了下照片,找到上周带着蛋挞打疫苗回家的照片,于是新生一记,如何把这些图片玩起来~ 80后应该都有印象,小时候有种 ...

  10. Sublime Text3添加到右键菜单,"用 SublimeText3 打开"

    在Sublime Text3安装目录下新建一个文件 sublime_addright.inf 文件内容: [Version] Signature="$Windows NT$" [D ...