网络流真的是很不错的算法,因为它富有想象力

最小路径覆盖问题

考虑把原问题等价一种网络流的最终态。
假设初始每个点单独为一条路径。考虑合并路径(前提为首尾相接)。路径数为n减合并次数。
把每个点拆成入点xi和出点yi,把有向边(u,v),连边:xuyv。如果这条边有流量意味着选择了这条边,同时也限定着每个点只能作一次出点和一次入点。

方格取数问题(不共存条件的最小割问题)

给了很多对不共存的位置,每个位置有权值。问满足条件下最大总权值。
可以先全选,考虑删最少权值使得满足条件。
而这道题有特殊性:不共存的点可以分别存在于两部分。比如说将不共存的每对连边,可以构成二分图。
因此两组点分别向起点和终点连边,边权权值。共存的点连边,边权inf。

最长不下降子序列问题

网络流模拟动态规划
i为起点的最长不降子序列长度 f(i)。设最长上升子序列为K
同样每个点拆成两个点,中间边权为选的次数上限。
起点连向f(i)=1的点,同理f(i)=K的连向重点。
然后斜着连转移边。

【SRM577】BoardPainting

用最少数目的直上直下的不重叠联通块覆盖棋盘。
转化:合并次数尽量多。限制(不能出现拐着的棋盘)
构三类点:棋盘上的块,横着相邻,纵着相邻。
相邻合并的节点连接所合并的两个点,边权都为inf。
然后S连横,纵连T
最后会割掉不合并的相邻块,且使得ST不连通(不连通限制了一个点要么被横着合并,要么被纵着合并)

割成两类,限制类别给贡献(CF311E)。

限制点集里的点都为S类,建立一个该限制的虚拟节点,连起点(权值为不满足的代价),连向限制点集合边权为inf。
每个点本身连向自己所属的类,边权为vi

最大权闭合子图

  • 闭合子图:满足点集里每个点若选择了,它出边所到的点也必须选择的图
  • 求解:最小割
    S连每个正权结点,边权为正权。负权连T,边权为点权绝对值。其它表示逻辑关系的边权为inf。
    一组割集,把图分成两部分,发现跟S联通的部分为一个闭合子图,所以割集跟闭合子图构成了双射。
    ans=||=(+)=