【算法学习】网络流模型与套路

网络流模型

最大权闭合子图

定义:图中每个点有点权,或正或负。在选择一个点后,必须选择某些后继点。一般情况求最大的收益。

求解:对于点权为正的点(一般为收益),源点 S S S向正权点连边,容量为点的权值。对于点权为负的点(一般为花费),向汇点 T T T连边,容量为负权绝对值。对于要选择后继关系的点,前驱点向后继点连边,容量为 i n f inf inf。跑最大流,求出最小割。最终答案 = 正权点之和 - 最小割。

解的输出:看跑完最大流后的 v i s i t visit visit数组,若为 T r u e True True则表明选择,反之表明不选择。

二分图最大匹配

定义:给出二分图,边代表可能的匹配关系。求出最大的匹配数目。

求解:建立源点 S S S和汇点 T T T,源点 S S S向左点集连边,容量为1,右集合向汇点 T T T连边,容量为1。若左集合中某点 v l v_l vl与右集合某点 v r v_r vr有连边,则 v l v_l vl v r v_r vr连边,容量为1。跑最大流,最大流即为最大匹配数目。

解的输出:根据跑完最大流后的结果。依次看左集合每个点向右集合边的流量,若为1,表明选中这条边对应的匹配关机,反之不选择。

二分图的最小点覆盖

二分图的最小点覆盖有两种,一种点权全部为1(朴素情况),一种是各个点带不同点权(推广情况)。

朴素二分图最小点覆盖

定义:给出一张二分图,选出最小的点集 V V V,使得每一条边至少有一个顶点在 V V V中。

求解:二分图的最小点覆盖数目 = 二分图的最大匹配数目

二分图最小点权覆盖

定义:给出一张二分图,选出点集 V V V,使得每一条边至少有一个顶点在 V V V中,并且点集权值 ∑ i = 1 ∣ V ∣ v i \sum_{i=1}^{|V|}v_i i=1Vvi最小。

求解:建立源点 S ​ S​ S和汇点 T ​ T​ T,源点 S ​ S​ S向左点集每一点连边,容量为点权值,右点集每一点向汇点 T ​ T​ T连边,容量为点权值。对于二分图内部的边,如 v l ​ v_l​ vl v r ​ v_r​ vr的边,连边,并且容量为 i n f ​ inf​ inf(使得此边不在最小割中)。跑最大流,求出最小割,即为最下点权覆盖权值。

二分图的最大独立集

二分图的最大独立集分两种,一种点权全部为1(朴素情况),一种是各个点带不同点权(推广情况)。

朴素二分图的最大独立集

定义:给出一张二分图,选出最大的点集 V V V,使得点集 V V V中没有任意两点有边相连。

求解:二分图的最大独立集 = 顶点数 - 最小点覆盖

二分图的最大点权独立集

定义:给出一张二分图,选出点集 V V V,使得点集 V V V中没有任意两点有边相连,并且 ∑ i = 1 ∣ V ∣ v i \sum_{i=1}^{|V|}v_i i=1Vvi最大。

求解:最大点权独立集权值 = 总点权 - 最小点权覆盖权值

有向图最小路径覆盖

有向图最小路径覆盖有两种,分别为最小不相交路径覆盖最小可相交路径覆盖

最小不相交路径覆盖

定义:给出 D A G DAG DAG,求出最小的有向路径条数,记为 P = { P 1 , P 2 … P n } P = \{P_1,P_2 \dots P_n\} P={P1,P2Pn},若 D A G DAG DAG中每个顶点都恰好在 P P P的一条道路上,那么 P P P则为此 D A G DAG DAG的最小路径覆盖。注意单个点也可以是一条覆盖路径。

求解:最小路径覆盖数目 = 顶点数 - 最大匹配数目
将每个点 v i v_i vi拆分为 v i 、 v i ′ v_i、v_i' vivi。令 v i v_i vi为二分图左集合, v i ′ v_i' vi为二分图右集合。源点 S S S连左集合 v i v_i vi,容量为1,汇点连右集合 v i ′ v_i' vi,容量为1。若原图有 v i v_i vi v j v_j vj的有向边,则连边 v i v_i vi v j ′ v_j' vj,容量为1。跑最大流,得到最大匹配数目,进而得到最小路径覆盖数目。

解的输出:输出解需要理解左右集合的含义。若右集合中的点 v i ′ v_i' vi在最大流中有边指向,表示最小路径覆盖中有路径以 v i v_i vi结尾;又因为 D A G DAG DAG中每个点都在路径覆盖中,所以右集合中没有被指向的顶点一定为最小路径覆盖的起始点。据此可以找到所有覆盖路径的起点。
找到起点后,依次枚举每一个点 v i ′ v_i' vi,找到其左集合对应顶点 v i v_i vi,根据最大流中的关系,找到有流量的右集合中的点 v j ′ v_j' vj,再转到 v j v_j vj根据流量关系寻找顶点,知道左集合不存在有流量的出边,表示找完一条覆盖路径。

【算法学习】网络流模型与套路_第1张图片

如图,从B集合的1找到3,再从3找到4,在从4找到6,因为A中的6不存在有流量的边指出到B集合,故1-3-4-6是其中一条覆盖路径。

最小相交路径覆盖

待填坑

你可能感兴趣的:(算法学习)