网络流系列(算法流程)

只有算法流程没有推导过程,自己复习用的

1.最大流

Dinic算法

Bfs: 用对于所有\((u,v,w)\in E ,w>0\)的边,构造分层图 ,统计\(dis[..]\)数组

Dfs: 模拟流的进行,只在分层之间的边之间转移,注意利用\(dis\)数组把没有更多流量的点标记掉

Dinic:每次Bfs分层之后不断Dfs直到没有增广路

方案:直接访问最大流的边权得到方案

2.最小割

求法同最大流

方案:Bfs之后看出每个点与S是否联通

3.费用流

EK费用流

初始化:反边的代价为相反数

SPFA:以代价为边权,用\(w>0\)的边,费用为边权跑出最短路\(dis[..]\)

Dfs:每次Dfs前清空标记,在最短路/最长路间模拟,每次访问都打标记(图不是拓扑图,防止被卡在环上)

EK: 注意答案是$dis[T]\cdot $增广长度,每次SPFA之后一直增广直到不存在

Dijkstra费用流

先用Johnson算法重置边权,然后跑EK

4.上下界网络流

$E=\lbrace (u,v,L,R) \rbrace $

无源汇循环流

加入源汇点\(S,T\)

假定每条边都先取\(L\),求出每个点的入流量和出流量\(ind_i,outd_i\),对于\(ind_i>outd_i\)的连\(S\)\(i\)的边,否则连\(i\)\(T\)的边,权值为\(|ind_i-outd_i|\),同时原图中的边权变为\(R-L\)

Dinic之后,如果所有与\(S,T\)相连的边满流则存在一个可行的循环流

有源汇可行流

连一条\(T\)\(S\)\([0,+\infin)\)的边,然后对于图求出一个可行的循环流,去掉\(T\)\(S\)的边之后就是一个可行流

有源汇最小流

在可行流的基础上,对于原图上的残量网络,跑出\(T\rightarrow S\)的最大流减去即可

有源汇最大流

在可行流的基础上,对于原图上的残量网络,跑出\(S\rightarrow T\)的最大流加上即可

原文地址:https://www.cnblogs.com/chasedeath/p/12715701.html