只有算法流程没有推导过程,自己复习用的
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\)的最大流加上即可