网络流定理总结

By tyqtyq, 若有遗漏请点击左边链接谢谢

DAG 有向无环图类别

$DAG最小路径覆盖=|G|-二分图G'的最大匹配$

最小路径覆盖定义: 用最少的路径覆盖整个图的所有顶点各一次(路径可以为一个点)


G': 把原图中每个点$i$拆分为两个点$i_1,i_2$,若原图中边$(x,y)$存在,则G'中边$(x_1,y_2)$存在


证明
   
   
定理证明:如果匹配数为零,那么P中不存在有向边,于是显然有最小路径覆盖=|G|-最大匹配数=|G|。在匹配数为0的基础上,即S中一条边没有,如果在S中增加一条匹配边(i1,j2),那么在图G的路径覆盖中就存在一条由i连接j的边,也就是说i与j 在一条路径上,于是路径覆盖数就可以减少一个;如此继续增加匹配边,每增加一条,路径覆盖数就减少一条;直到匹配边不能继续增加时,路径覆盖数也不能再减少了;但是这里只 是说明了每条匹配边对应于路径覆盖中的一条路径上的一条连接两个点之间的有向边;下面来说明一个路径覆盖中的每条连接两个顶点之间的有向边对应于一条匹配 边。与前面类似,对于路径覆盖中的每条连接两个顶点之间的每条有向边 ,我们可以在匹配图中对应作一条连接i1与j2的边, 显然这样做出来二分图中的边均为匹配,即连接的X和Y中的两个点之前都未匹配过,否则匹配过的那个点对应原图时就被覆盖两次,与路径覆盖矛盾。这就说明匹配边与路径覆盖图中连接两顶点之间边的一一对应关系,那么也就说明了前面的公式成立,即S中每增加一条匹配边,路径覆盖数减少1.(引用来自以上链接)

代码:

#define getpoint(i,X) (X == 1)?(i):(i+n) 
void dfs(int n){
    for(int i=head[n]; i; i=Next[i]){
        int v = ver[i] ; add_new(getpoint(i,1),getpoint(p,2)) ;    
        dfs(v) ;
    }
}
void work(){
    dfs(1) ;
}

猜你喜欢

转载自www.cnblogs.com/tyqtyq/p/WangLuoLiu.html