[CODEVS 1904]最小路径覆盖问题
【问题描述】
给定有向图G=(V,E)。设P是G的一个简单路(顶点不相交)的集合。如果V中每个顶点恰好在P的一条路上,则称P是G的一个路径覆盖。P中路径可以从V的任何一个顶点开始,长度也是任意的,特别地,可以为0。G的最小路径覆盖是G的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图G的最小路径覆盖。
对于给定的给定有向无环图G,编程找出G的一个最小路径覆盖。
【输入】
第1 行有2个正整数n和m。n是给定有向无环图G的顶点数,m是G的边数。接下来的m行,每行有2个正整数i和j,表示一条有向边(i,j)。
【输出】
将最小路径覆盖输出。从第1行开始,每行输出一条路径。文件的最后一行是最少路径数。
【算法分析】
先前对于最大流算法只是了解了理论,并不会真正用代码来实现。但是后来看到sjj118的博客代码并向其请教之后,才理解了构建残存网络和寻找增广路的BFS和DFS的具体实现。
将每个点分为X、Y两个节点集,如果(i,j)∈E则在新图中加边(Xi,Yj),设每条边容量为1,求出二分图匹配flow(即最大流),答案就是n-flow。
代码实现和解析请单击这里:最小路径覆盖 Designed By sjj118
p.s.在CodeVS评测系统中,无需输出路径即可AC。