这种一般遇到得比较少,除非是板题
这种问题一般是把全集分为两类数,求分开这个集合(或是选出某个子集)的最小代价是多少。
有关技巧:
利用容量为INF的边来干涉决策,如最大权闭合子图
将所选集合的点的邻接边权求和分析,如最大密度子图
判定S,T集合时必须用dfs
相关算法:
分数规划
易错点:
cnt初始时没有赋为1(很容易浪费时间)
在写gap优化时一定要单独注明总点数sz
总点数计算容易算错(想的和写的不一致,编号和实际使用点数不匹配)
注意加的是单向边还是双向边
全局最小割一般比较明显(其实最小割树也比较明显)
但有一些基于最小割树的构造问题会比较麻烦
在解决这些问题时一定要抓住最小割的性质
如:
c(u,v)>=min(c(u,w1),c(w1,w2),c(w2,w3)...,c(wn,v))
其他的都了解即可
相关算法:
边分治等树上算法(其实暴力也是可以的,反正点数已经在很小的范围了)
网络流中最麻烦的东西
1、无源汇的上下界可行流
我们先有一个想法,把所有的上下界为 [l,r] 边(u,v)拆成 l 和 r-l 的两条边(u,v) (注意都是有向边)
l 是我们的必须边,于是我们可以把它拆成两半,插在一个TMP池子中,即把 l (u,v)拆成 l (u,TMP)和 l (TMP,v)
如果我们保证这两条边都是满流的,就说明了这个问题是可解的
我们可以继续把池子TMP也拆成两个池子S和T,必须边 l (u,v)就变成了 l (S,v)和 l (u,T)
这时,我们从S到T做一个最大流(注意,此时的非必须边 r-l (u,v)是一直存在的),如果S的所有出边和T的所有入边都满流了,就说明了所有的必须边都是可以通过非必须边转移一些流量而达到满流,即找到了一个可行解
否则就无解
2、有源汇的上下界最大流
先把原图的源汇点s,t之间连一条 INF (t,s)的边,让它们构成一个循环流,重复 1 的步骤,即可得到一个可行解
此时拆掉新增的S、T与其相连的边和新增的 INF (t,s)边
再从原图(此时已经是残余网络)的s,t做一个最大流
答案=第一次最大流完成后INF(t,s)边流过的流量+第二次的最大流流量
3、有源汇的上下界最小可行流
先直接做一次1,跑一次最大流,然后连上INF(t,s)再跑一次最大流,答案为第二次最大流后INF(t,s)边的容量
注意每次S,T最大流之后都要判断无解的情况!!!!
有一些矩阵有关的题目,可能会用到上下界网络流
费用流最重要的就是 把 流的过程 看作 对题意过程的模拟
于是就出现了很多巧妙的费用流模型
但这些模型都不太具有一般性,所有也不方便总结,只有考场上现推
关于上下界最小费用可行流
其实就是和上下界最小费用流差不多,只不过先把必须边的费用计算了,再把非必须边附上费用跑最小费用流。
提供一些通用的思路:
1、最大流最小割求最大利润,除了可以最大权闭合子图以外,还有一些非普遍的模型需要现场分析:
怎么分析?关键是找到题目中的矛盾关系,比如选择两个方案的一种来获得利润(两种方案的关系为 或 )
就可以把这样建模:---方案1代价--->---利润(可以是INF,即两种代价必须付出至少一种)--->---方案2代价---> (可能还要一些INF的边来构建利润之间的关系)
2、黑白染色:网格选点问题常用
3、费用流问题,可以先假设已经完成分配的代价,再来在预设代价上用费用流更新。