[网络流专练3][最小路径覆盖问题]

题目描述

«问题描述:

给定有向图G=(V,E)。设P 是G 的一个简单路(顶点不相交)的集合。如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖。P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0。G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图G 的最小路径覆盖。提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下:

每条边的容量均为1。求网络G1的( 0 x , 0 y )最大流。

«编程任务:

对于给定的给定有向无环图G,编程找出G的一个最小路径覆盖。

输入输出格式

输入格式:

件第1 行有2个正整数n和m。n是给定有向无环图G 的顶点数,m是G 的边数。接下来的m行,每行有2 个正整数i和j,表示一条有向边(i,j)。

输出格式:

从第1 行开始,每行输出一条路径。文件的最后一行是最少路径数。

输入输出样例

输入样例#1:

11 12
1 2
1 3
1 4
2 5
3 6
4 7
5 8
6 9
7 10
8 11
9 11
10 11

输出样例#1:

1 4 7 10 11
2 5 8
3 6 9
3

Solution

1.模型:有向无环图DAG的最小路径覆盖

  • s->Xi,容量为1。
  • Xi->Yj,(i, j)∈E,容量上界为1。
  • Yi->t,容量上界为1。

DAG的最小路径覆盖=|V|-对应二分图的最大匹配。

约束是什么?对路径的定义中,有至关重要的一点:允许长度为0。于是解的存在性得到了保证。因此,只需满足:对于任意一点,至多有一条与它关联的入边和与它关联的出边被选中。
二分图的匹配,可以从顶点对应的角度看待,也可以从边的角度看待:选出一些边,使得每个顶点至多与一条边关联。和本问题的约束对比,发现有向无环图不是二分图,并且对于顶点而言,边分为入边和出边两类。考虑把点i拆成Xi、Yi,入边连到Yi,出边从Xi出发。这样,问题的约束便和二分图匹配相一致。

目标是什么?使路径覆盖数最小。除了直接数,还能用什么来刻画路径覆盖数?头的数量或尾的数量。什么样的点是头?没有匹配边与对应的Yi关联。尾?没有匹配边与对应的Xi关联。所以,DAG的最小路径覆盖=|V|-对应二分图的最大匹配。

hzwer这儿有另一种更简洁的看待方法:

如果无匹配,显然要n条路径才能覆盖所有点,两个点匹配意味着将可以把它们用一条路径覆盖,路径数就可以减1

我还有一种另类看待方法:
带上下界的网络流。
Step 1
- s->Xi,容量上界为1。
- Xi->Yi,容量下界为1,上界inf。
- Yi->Xj,(i, j)∈E,容量上界为1。
- Yi->t,容量上界为1。
求解s-t最小流。

Step 2
看出一个可行流,于是省去通常求解s-t可行流的步骤。
网络变换为:
- Xi->s,容量上界为1。
- Yi->Xj,(i, j)∈E,容量上界为1。
- t->Yi,容量上界为1。
此网络的t-s最大流与原s-t可行流的叠加,即为原s-t最小流。s-t可行流的值为|V|,用|V|去减t-s最大流即可。

这种看待方法和hzwer的在实质上相同,但是是从形式上的变换得到的。

为什么强调DAG?因为我们只是简单地拆点、匹配,而没有在意这两点是否已经在同一条路径里了。比如,一个环,对应二分图的最大匹配为|V|,实际上,作为一条有始有终的“路径”,它是不能封口的。

转载自http://blog.csdn.net/ruoruo_cheng

因此,ans=n-最大匹配

2.算法

二分图最大匹配用网络流最大流实现

时间: 2024-10-13 04:26:52

[网络流专练3][最小路径覆盖问题]的相关文章

LiberOJ #6002. 「网络流 24 题」最小路径覆盖

#6002. 「网络流 24 题」最小路径覆盖 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 给定有向图 G=(V,E) G = (V, E)G=(V,E).设 P PP 是 G GG 的一个简单路(顶点不相交)的集合.如果 V VV 中每个顶点恰好在 P PP 的一条路上,则称 P PP 是 G GG 的一个路径覆盖.P PP 中路径可以从 V VV 的任何一个顶点开始,

网络流24题之最小路径覆盖问题

DAG的最小不相交路径覆盖 算法:把原图的每个点V拆成Vx 和Vy两个点,如果有一条有向边A->B,那么就加边Ax−>By .这样就得到了一个二分图.那么最小路径覆盖=原图的结点数-新图的最大匹配数. 证明:一开始每个点都是独立的为一条路径,总共有n条不相交路径.我们每次在二分图里找一条匹配边就相当于把两条路径合成了一条路径,也就相当于路径数减少了1.所以找到了几条匹配边,路径数就减少了多少.所以有最小路径覆盖=原图的结点数-新图的最大匹配数. 因为路径之间不能有公共点,所以加的边之间也不能有

「网络流24题」最小路径覆盖问题

传送门:>Here< 题意:求DAG的最小路径覆盖并输出方案.所谓最小路径覆盖是指,将原图分为若干条路径,任意两条路径不能有公共点,要使路径数量尽可能少 思路分析 依然能够联系到二分图.事实上这个问题在学二分图的时候提到过,然而当时并没有弄明白…… 公式:DAG的最小路径覆盖 = 顶点数 - 最大匹配 千万不要弄混淆的是这里的最大匹配并不是指直接在DAG上做最大匹配,而是需要拆点然后搞. 具体过程如下: 原图共有N个点.将每个点$i$拆成两个点,记为$X_i$与$Y_i$,对于任意一条原图中的

LibreOJ #6002. 「网络流 24 题」最小路径覆盖

内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 网络流 最大流 屠龙宝刀点击就送 #include <cstring> #include <cstdio> #include <queue> #define N 6005 #define inf 0x3f3f3f3f using namespace std; bool flag[N]; int n,m,dep[N],nextt[N<

P2764 最小路径覆盖问题

题目描述 ?问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. ?编程任务:

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

LiberOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在

【网络流24题 #03】最小路径覆盖问题

题目链接:最小路径覆盖问题 哇 卡在输出也是醉了 重要结论:最小路径覆盖数 = 结点数(拆成边之前) -  最大流 本题也是点拆边 与[网络流24题 #04]魔术球问题 有异曲同工之妙 void output(int x){ if(x >= S) return ; printf("%d ", x >> 1); for(int i = head[x]; i != -1; i = edge[i].next) if(!edge[i].w && edge[i]