[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。

posted on 2016-02-21 11:03  Double680  阅读(137)  评论(0编辑  收藏  举报

导航