- 参考胡伯涛论文《最小割模型在信息学竞赛中的应用》
1.定义 |
定义有向图(G=(V,E))的一个闭合子图是该有向图的一个点集,其中这个点集中的所有点的出边连向的还是点集中的点
最大权闭合子图,就是在给每个点赋上权值之后,点集权值和最大的一个闭合子图
举个栗子:
![](https://images.cnblogs.com/cnblogs_com/kikokiko/1638452/o_200531022832%E6%9C%80%E5%A4%A7%E6%9D%83%E9%97%AD%E5%90%88%E5%9B%BE1.png)
图中有九个闭合图:(emptyset,{3,4,5},{4,5},{5},{2,4,5},{2,5},{2,3,4,5},{1,2,4,5},{1,2,3,4,5})
其中最大权闭合图为({3,4,5}),权值和为(4)
2.算法 |
构造:
加入源点(S),汇点(T),把图(G=(V,E))构成一个网络:
-
源点向所有正权点连边,容量为正权点权值
-
所有负权点向汇点连边,容量为负权点权值的绝对值
-
(0)权值点可以当作正权点或者负权点,无影响
-
原图中的边保持不变,容量为(INF)
![](https://images.cnblogs.com/cnblogs_com/kikokiko/1638452/o_200531025655%E6%9C%80%E5%A4%A7%E5%85%A8%E9%97%AD%E5%90%88%E5%9B%BE2.png)
在构造得到的流网络中找到一个不包含容量为(INF)的边的割集(即只包含和源汇点相连的边的简单割),割集把原网络的点集分为两部分,一部分和(S)相连,一部分和(T)相连,这两部分除去(S)和(T)分别构成了一个闭合子图
例如:
![](https://images.cnblogs.com/cnblogs_com/kikokiko/1638452/o_200531033730%E6%9C%80%E5%A4%A7%E6%9D%83%E9%97%AD%E5%90%88%E5%9B%BE3.png)
其中和(S)相连的部分代表的闭合子图({1,2,4,5}),和(T)相连的部分代表(emptyset)
结论:
原图对应的最大权闭合图的权值和为所有正权点的权值和减去最小割
证明:
- 定义简单割为所有割边只和(S,T)关联的割集
- 在我们构造出来的图中,最小割必然是简单割
如果最小割不是简单割,那么割集中必然包含了(INF)的边,这和最小割定义冲突,所以最小割是简单割
- 闭合图和简单割一一对应
- 简单割对应闭合图
一个简单割不存在(INF)边,所以分割得到的点集所连出的点也在相应点集内,简单割对应闭合图
- 闭合图对应简单割
假设割集中存在(INF)的边,那么对于某个点(u),它连出的点(v)必然不在相同点集内,就不能构成闭合图,所以闭合图对应简单割
割集把原网络分为两部分,令(V_S)为和源点相连的点集,(V_S)为与汇点相连的点集
(V_S^- V_S^+ V_T^- V_T^+)分别表示对应点集中的点权为正或者负的点子集
可以得到一个割集的权值和为:(sum_{vin V_T^+}w_v + sum_{vin V_S^-}(-w_v))
因为正权点都和源点(S)连边,负权点都和汇点(T)连边,所以在(V_S)中的负权点都是和(T)割开的点,在(V_T)中的正权点都是和(S)割开的点
- 最小割的割集形成的点集(V_S)和(V_T)中,(V_S-{S})就是最大权闭合子图中的点,且最大权值和为所有正权点的权值和减去最小割
可以发现,割集中和(S)相连的边都是不选的正权点,和(T)相连的都是不选的负权点
(所有正权点的权值和-割集=正权点权值和-(不选的正权点权值和+选的负权点的绝对值的权值和))
(=选的正权点的权值和-选的负权点的绝对值的权值和)
(=选的正权点的权值和+选的负权点的权值和)
(=闭合图的权值和)
而原图中的正权点的权值和是定值,所以只要最小化割集的容量即可,所以答案就是最小割
1.定义 |
定义一个无向图(G=(V,E))的密度(D)为边数(|E|)和点数(|V|)的比值,即(D=frac{|E|}{|V|})
无向图(G=(V,E))的最大密度子图(G=(V',E'))为无向图(G=(V,E))的一个子图且具有最大的(D=frac{|E'|}{|V'|})
举个栗子:
![](https://images.cnblogs.com/cnblogs_com/kikokiko/1638452/o_200601055952%E6%9C%80%E5%A4%A7%E5%AF%86%E5%BA%A6%E5%AD%90%E5%9B%BE1.png)
图中红色的点和边构成了最大密度子图,密度为(frac{5}{4})
2.算法 |
可以把问题转化为求(D=f(hat{x})=frac{sum_{ein E}x_e}{sum_{vin V}x_v})
其中(x_e,x_vin{0,1}),如果是(1)表示在子图中,(0)表示不在子图中并且如果边((u,v))子图中,边((u,v))的两个端点(u,v)也必然在子图中
我们假设最优的密度为(g),那么构造一个函数(h(g)=argmax_{hat{x}}{sum_{ein E}1cdot x_e-sum_{vin V}gcdot x_v })
假设最优密度为(D),可以得到:
所以可以二分密度,问题转化为如何找到(h(g)=argmax_{hat{x}}{sum_{ein E}1cdot x_e-sum_{vin V}gcdot x_v })的最大值
可以发现对于每条边(e(u,v)in E),要加入子图中的前提是(u,v)都在图中,所以容易发现这可以用最大权闭合图来解决
- 每条边作为一个点,向这条边的两个端点连(INF)的边
- 源点向所有原图中的边连边,容量为(1)
- 原图中的点向汇点连边,容量为(g)
![](https://images.cnblogs.com/cnblogs_com/kikokiko/1638452/o_200601065356%E6%9C%80%E5%A4%A7%E5%AF%86%E5%BA%A6%E5%AD%90%E5%9B%BE2%20(2).png)
二分的上下界分别为(|E|)和(0)
例题:POJ3155 Hard Life