ghj1222又更新博客了。尽管不能做到高产似母猪,但是最近又开始想更新了。
学网络流这么长时间了,才知道有最大权闭合子图这种科技,我真是太菜了。
什么是最大权闭合子图?
给定一个DAG(好像是DAG??大雾),每个点有权值(可正可负),要求钦定图中的一些点,满足:
- 钦定点所有后继点都被钦定
- 所有点的点权和最大
求最大点权。
解法:考虑网络流建图。
- 在原图中给所有边赋容量inf。
- 新建src,对于所有点权为正的点,从src到该点连接容量为该点点权的边。
- 新建dest,对于所有点权为负的点,从该点到dest连接容量为该点点权绝对值的边。
然后从src到dest跑最大流,答案为所有正点权的和减去最大流。
原理:根据最大流最小割定理,我们跑出的最大流就相当于最小割。
考虑从src到dest的某一条路径。路径的形式一定是由src到某个正权值点,再到某个负权值点,再到dest。中途容量为inf的边在最小割中肯定是不会被切断的,所以只有两种情况:
- 切断src到正权点的边。统计答案时候我们一开始加上了所有正权点的边的流量,在减去最小割的时候又减去了这个流量,相当于不选这个正权点。
- 切断负权点到dest之间的边,即选这个正权点获得利益的同时在最小割中又包含了这个负权点的流量,减去最小割相当于选择这个正权点而导致选择负权点带来的损失。
其实网络流模型不难理解,稍微动动脑即可。
例题:[SHOI2017]寿司餐厅
题意特别恶心。我们对于某个区间[l,r]建立一个点,发现我们选择[l,r]就必须选择[l+1,r]和[l,r-1],选择区间就必须选择所有寿司(从而购买之),选择寿司就得选择那个寿司对应的mx^2
所以对于满足l<r的[l,r]向[l+1,r]和[l,r-1]连边,点权即为输入值;
对于[i,i]向寿司i连边,[i,i]点权为输入值,寿司i的点权为寿司i花费,注意是负的;
对于寿司i再向a[i]代号连边,对于某个代号j,点权为-mj^2
然后对于这个图跑最大权闭合子图即可。代码太丑,不放了。