定义:图中每个点有点权,或正或负。在选择一个点后,必须选择某些后继点。一般情况求最大的收益。
求解:对于点权为正的点(一般为收益),源点 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=1∣V∣vi最小。
求解:建立源点 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=1∣V∣vi最大。
求解:最大点权独立集权值 = 总点权 - 最小点权覆盖权值
有向图最小路径覆盖有两种,分别为最小不相交路径覆盖和最小可相交路径覆盖。
定义:给出 D A G DAG DAG,求出最小的有向路径条数,记为 P = { P 1 , P 2 … P n } P = \{P_1,P_2 \dots P_n\} P={P1,P2…Pn},若 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' vi、vi′。令 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根据流量关系寻找顶点,知道左集合不存在有流量的出边,表示找完一条覆盖路径。
如图,从B集合的1找到3,再从3找到4,在从4找到6,因为A中的6不存在有流量的边指出到B集合,故1-3-4-6是其中一条覆盖路径。
待填坑