有向无环图的路径覆盖问题就是在图中找一些不相交的简单路径,使之覆盖图中的所有顶点,且任何一个顶点有且只有一条路径与之关联(如果沿这些路径中的每条路径从起点到终点,那么恰好可以经过图中每个顶点一次且仅一次)。
从上述定义中可以看到:
(1)每个单独的顶点都可以是一条路径。
(2)如果存在路径(p1,p2,,,,pk),那么在覆盖图中,顶点p1,p2,,,,pk,不再与其他的顶点之间存在有向边。
有向无环图的最小路径覆盖就是找出最小的路径条数,使这些路径成为原图的一个路径覆盖。
从以上分析中,我们可以利用第(2)条性质,在图中找出与其他顶点之间存在有向边的点,然后用总点数减去它就可以得到最小路径覆盖数。
即,最小路径覆盖的条数,就是原图顶点数,减去二分图最大匹配数。沿着匹配边查找,就是一个路径上的点,输出所有路径即可。
#include <iostream>
#include <cstdio>
using namespace std;
const int oo=1e9;
const int mm=1e5;
const int mn=555;
int node,src,dest,edge;
int ver[mm],next[mm],flow[mm];
int head[mn],work[mn],dis[mn],q[mn];
void prepare(int _node,int _src,int _dest)
{
node=