Hdu 3488 Tour (KM 有向环覆盖)
题目链接:
题目描述:
有n个节点,m条有权单向路,要求用一个或者多个环覆盖所有的节点。每个节点只能出现在一个环中,每个环中至少有两个节点。问最小边权花费为多少?
解题思路:
因为每个节点就出现一个,那么每个节点出度和入度都为1咯。我们可以对每个节点u拆点为u,u',分别放在集合X,Y.然后对两个集合进行完备匹配。完备匹配成功以后,每个节点就会有只有一个出度,一个入度的。
用KM求最小匹配的话,先初始化maps为-INF,然后把各边权值存为负,求出最大值取反即可。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int maxn = ;
- const int INF = 0x3f3f3f3f;
- int maps[maxn][maxn], used[maxn], s[maxn], n;
- int lx[maxn], ly[maxn];
- bool visx[maxn], visy[maxn];
- bool Find (int x)
- {
- visx[x] = ;
- for (int i=; i<=n; i++)
- {
- if (!visy[i] && lx[x]+ly[i]==maps[x][i])
- {
- visy[i] = ;
- if (!used[i] || Find(used[i]))
- {
- used[i] = x;
- return true;
- }
- }
- else
- s[i] = min (s[i], lx[x] + ly[i] - maps[x][i]);
- }
- return false;
- }
- int KM ()
- {
- memset (used, , sizeof(used));
- memset (lx, , sizeof(lx));
- memset (ly, , sizeof(ly));
- for (int i=; i<=n; i++)
- for (int j=; j<=n; j++)
- lx[i] = max (lx[i], maps[i][j]);
- for (int i=; i<=n; i++)
- {
- for (int j=; j<=n; j++)
- s[j] = INF;
- while ()
- {
- memset (visx, , sizeof(visx));
- memset (visy, , sizeof(visy));
- if (Find(i))
- break;
- int d = INF;
- for (int j=; j<=n; j++)
- if (!visy[j])
- d = min (s[j], d);
- for (int j=; j<=n; j++)
- {
- if (visx[j])
- lx[j] -= d;
- if (visy[j])
- ly[j] += d;
- }
- }
- }
- int res = ;
- for (int i=; i<=n; i++)
- res += maps[used[i]][i];
- return res;
- }
- int main ()
- {
- int m, t;
- scanf ("%d", &t);
- while (t --)
- {
- scanf("%d %d", &n, &m);
- for (int i=; i<=n; i++)
- for (int j=; j<=n; j++)
- maps[i][j] = -INF;
- while (m --)
- {
- int u, v, s;
- scanf ("%d %d %d", &u, &v, &s);
- maps[u][v] = max(maps[u][v], -s;
- }
- printf ("%d\n", -KM());
- }
- return ;
- }
Hdu 3488 Tour (KM 有向环覆盖)的更多相关文章
- hdu 3488 Tour
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都只 ...
- HDU 3488 Tour(最小费用流:有向环最小权值覆盖)
http://acm.hdu.edu.cn/showproblem.php?pid=3488 题意: 给出n个点和m条边,每条边有距离,把这n个点分成1个或多个环,且每个点只能在一个环中,保证有解. ...
- HDU 3488 Tour (最大权完美匹配)【KM算法】
<题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...
- 图论(二分图,KM算法):HDU 3488 Tour
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU - 3488 Tour (KM最优匹配)
题意:对一个带权有向图,将所有点纳入一个或多个环中,且每个点只出现一次,求其所有环的路径之和最小值. 分析:每个点都只出现一次,那么换个思路想,每个点入度出度都为1.将一个点拆成两个点,一个作为入度点 ...
- HDU 6311 Cover (无向图最小路径覆盖)
HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- Tour HDU - 3488 有向环最小权值覆盖 费用流
http://acm.hdu.edu.cn/showproblem.php?pid=3488 给一个无源汇的,带有边权的有向图 让你找出一个最小的哈密顿回路 可以用KM算法写,但是费用流也行 思路 1 ...
- HDU 3488 KM Tour
参考题解 这题注意有重边.. #include <cstdio> #include <cstring> #include <algorithm> using nam ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
随机推荐
- 碧砚适合佳能328 4452 ICD520 4472 4450 硒鼓4700一体机墨盒4770
- 【.Net Core 学习系列】-- EF Core 实践(Code First)
一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project --> ...
- 系统性能不够原因可能是cpu不够,内存不够等等
1.Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息. 通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 2. ...
- javax/servlet/ServletContext : Unsupported major.minor version 51.0
原文:http://blog.csdn.net/mlin_123/article/details/50738532 解决:将版本从 3.1.0 改为 3.0.1 <!-- 添加servlet A ...
- win7电脑定时开机设置方法
在BIOS设置主界面中选择“Power Management Setup”,进入“电源管理”窗口. 注:缺省情况下,“Resume By Alarm”定时开机选项是关闭的. 将鼠标移到“Resume ...
- AES算法加密java实现
package cn.itcast.coderUtils; import java.security.Key; import javax.crypto.Cipher; import javax.cry ...
- MySQL基础笔记(一) SQL简介+数据类型
MySQL是一个关系型数据库管理系统(RDBMS),它是当前最流行的 RDBMS 之一.MySQL分为社区版和企业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发 ...
- EditText设置光标位置问题
普通设置 EditText 光标显示位置的方法就是 et.setSelection(text.length()); et.setSelection(0); 设置0 就是第一位了. 设置text长度就最 ...
- iOS与HTML交互问题
一. 加载后台传过来的HTML标签,文字都能正常显示但是图片显示不了.找问题找了很久没有发现那个地方写错,也问了别人都不知道,后来问了Android才知道,后台传过来的HTML标签,有些是转义过的.移 ...
- the JSON object must be str, not 'bytes'
{ "ErrorDump": "the JSON object must be str, not 'bytes'", "StatusCode" ...