最大权闭合子图 最大密度子图学习笔记
- 参考胡伯涛论文《最小割模型在信息学竞赛中的应用》
1.定义 |
定义有向图G=(V,E)的一个闭合子图是该有向图的一个点集,其中这个点集中的所有点的出边连向的还是点集中的点
最大权闭合子图,就是在给每个点赋上权值之后,点集权值和最大的一个闭合子图
举个栗子:

图中有九个闭合图:\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

在构造得到的流网络中找到一个不包含容量为INF的边的割集(即只包含和源汇点相连的边的简单割),割集把原网络的点集分为两部分,一部分和S相连,一部分和T相连,这两部分除去S和T分别构成了一个闭合子图
例如:

其中和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_{v\in V_T^+}w_v + \sum_{v\in 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'|}
举个栗子:

图中红色的点和边构成了最大密度子图,密度为\frac{5}{4}
2.算法 |
可以把问题转化为求D=f(\hat{x})=\frac{\sum_{e\in E}x_e}{\sum_{v\in V}x_v}
其中x_e,x_v\in\{0,1\},如果是1表示在子图中,0表示不在子图中并且如果边(u,v)子图中,边(u,v)的两个端点u,v也必然在子图中
我们假设最优的密度为g,那么构造一个函数h(g)=argmax_{\hat{x}}\{\sum_{e\in E}1\cdot x_e-\sum_{v\in V}g\cdot x_v \}
假设最优密度为D,可以得到:
所以可以二分密度,问题转化为如何找到h(g)=argmax_{\hat{x}}\{\sum_{e\in E}1\cdot x_e-\sum_{v\in V}g\cdot x_v \}的最大值
可以发现对于每条边e(u,v)\in E,要加入子图中的前提是u,v都在图中,所以容易发现这可以用最大权闭合图来解决
- 每条边作为一个点,向这条边的两个端点连INF的边
- 源点向所有原图中的边连边,容量为1
- 原图中的点向汇点连边,容量为g
.png)
二分的上下界分别为|E|和0
例题:POJ3155 Hard Life
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地