定义:通俗点讲,就是在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。
而最小路径覆盖又分为:最小不相交路径覆盖 和 最小可相交路径覆盖。
最小不相交路径覆盖 : 就是我们找到的每条路径不能相交,就是每条路径不能有同一个点。
最小可相交路径覆盖 : 这个与上面相对应,就是可以相交。
注意:每个点被自己覆盖,路径长度为0
求解最小不相交路径覆盖: 我们把每个点都拆成两个点,分为入点和出点,如果 u 到 v 有边,那么我们就让 u 的入点连向 v 的出点 , 最后跑一下最大流或者匈牙利 算出最大匹配。答案就是 点的数目 - 最大匹配数
求解最小可相交路径覆盖: 和上面很相似,但是我们再跑最大匹配时,我们先对原图进行一次闭包传递(通过Warshell传递闭包算法),然后过程就一样了。
最小不相交路径覆盖题目:POJ - 1422
AC代码:
#pragma GCC optimize(2)
#include<cstring>
#include<iostream>
#define int long long
using namespace std;
const int N=250;
int T,n,m,mat[N],vis[N],res;
int head[N],nex[N*N],to[N*N],tot;
void add(int a,int b){
to[++tot]=b; nex[tot]=head[a]; head[a]=tot;
}
bool find(int x,int id){
for(int i