路径覆盖
路径覆盖指一个路径的集合中所有路径点集的并集为原图点集。最小路径覆盖使路径集合大小最小。
路径覆盖分为可否重复选点两种。可重复选点在建模中加大流量即可。
网络流模型
- 建超级源 \(S\) 和超级汇 \(T\),将每个点拆点。
- 将 \(S\) 向所有点 \(i\) 连边,将所有点 \(i'\) 向 \(T\) 连边。
- 对于原图边集,每一条边 \(u\) 向 \(v'\) 连边。
- 选点不重的最小路径覆盖问题,上述所有边流量为 1,答案为点数减去最小割。
考虑对于这个模型建出来的图求出的最小割是什么。它实际上是最大的可以合并的路径条数。因为每合并两条路径相当于总路径数就减少了,所以有最小路径覆盖等于点数减最大匹配。
其中最大匹配就是我们刚才的模型。可以发现,我们实际上就是建了一个二分图在求最大匹配。
P2764 最小路径覆盖问题
题意如上,要求构造方案。
我的构造方式如下:利用并查集,对于每条道路的端点,若这条边被选择了就将这两条边加入一个并查集,每个并查集代表一条路径。最后从每个路径的起点进行一遍搜索即可。
1 |
|
P2469 星际竞速
题意
给你若干单向道路,并且每个点有一个可以从任意位置任意时刻到达该点的代价。求遍历所有点的最小代价。
思路
参照最小路径覆盖的思路,拆出来的第二个点与汇点间的连边表示到达该点。建模方式如下:
- 对于所给的所有边 \((u,v)\),将 \(u\) 向 \(v'\) 建边权费用边。
- 从源点向所有 \(i\) 连无费用边。
- 从所有 \(i'\) 向汇点连无费用边。
- 从源点向所有 \(i'\) 连传送费用边。上述所有边流量为 1。(因为从任何位置传送与起点无关)
跑最小费用最大流即为答案。正确性,考虑建出来的图,因为源点到所有点都有传送的边,所以跑最小割一定会经过所有点,并且因为都是单向边且流量为 1,所以保证正确。
1 |
|