网络流定理总结
By [tyqtyq](mailto: tyq11186192@outlook.com), 若有遗漏请点击左边链接谢谢
任意图
$最大流 = 最小割$
证明略
$最大权闭合子图的权值和 = 正权节点权值和-最小割$
在一个图中,我们选取一些点构成集合,记为V,且集合中的出边(即集合中的点的向外连出的弧),所指向的终点(弧头)也在V中,则我们称V为闭合图。最大权闭合
图即在所有闭合图中,集合中点的权值之和最大的V,我们称V为最大权闭合图。
此时,构建一个超级源点s,一个超级汇点t,所有的点按权值的正负连接到s和t上,转换成一个边权值有向图
有最大权闭合子图的权值和 = 正权节点权值和-最小割
DAG 有向无环图类别
$二分图最小点覆盖的点数=最大匹配数\;\;\;最大独立集=最小路径覆盖的边数=顶点数n-最大匹配数$
最小路径覆盖定义: 用最少的路径覆盖整个图的所有顶点各一次(路径可以为一个点)
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) ;
}
定理证明:如果匹配数为零,那么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) ;
}