题目描述
给定有向图 G=(V,E) 。设 P 是 G 的一个简单路(顶点不相交)的集合。如果 V 中每个定点恰好在P的一条路上,则称 P 是 G 的一个路径覆盖。PP中路径可以从 V 的任何一个定点开始,长度也是任意的,特别地,可以为 0 。G 的最小路径覆盖是 G 所含路径条数最少的路径覆盖。设计一个有效算法求一个 GAP (有向无环图) G 的最小路径覆盖。
输入格式
第一行有 22 个正整数 n 和 m 。 n 是给定GAP(有向无环图) G 的顶点数, m 是 G 的边数。接下来的 m 行,每行有两个正整数 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
分析
如果全部点本身作为一条路径,那总共有 nnn 条路径。任何两个点相连(一个点入度与出度最多为 111 ),都会使路径数减 111,现在就要让相连的点尽量多。
应该不难想到这是最大匹配问题(好吧有点难想?
将每个点 iii 拆成两个点 i,i′i,i'i,i′,对于每条有向边 (a,b)(a,b)(a,b),从 aaa 到 b′b'b′ 连一条边,表示这是一个匹配。如图。

这样,跑最大匹配,就是最多可以连的连边数。
最小路径覆盖 = 点数 - 最大匹配数
代码如下
#include <bits/stdc++.h>
#define N 100005
#define inf 2147483647
using namespace std;
struct node{
int a, b, c, n;
}d[N * 2], e[N];
int du[N], dep[N], gap[N], h[N], v[N], sum, cnt = 1, ans

该博客讨论了如何解决有向无环图(DAG)的最小路径覆盖问题。通过将问题转化为最大匹配问题,作者提供了算法思路:将每个节点拆分为两个节点,并根据图的边构造新的匹配图。运行最大匹配算法得到最大匹配数,最小路径覆盖即为节点数减去最大匹配数。博客还包含输入输出格式及样例。
最低0.47元/天 解锁文章
1044

被折叠的 条评论
为什么被折叠?



