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

图中有九个闭合图:
其中最大权闭合图为,权值和为
2.算法 |
构造:
加入源点,汇点,把图构成一个网络:
-
源点向所有正权点连边,容量为正权点权值
-
所有负权点向汇点连边,容量为负权点权值的绝对值
-
权值点可以当作正权点或者负权点,无影响
-
原图中的边保持不变,容量为

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

其中和相连的部分代表的闭合子图,和相连的部分代表
结论:
原图对应的最大权闭合图的权值和为所有正权点的权值和减去最小割
证明:
- 定义简单割为所有割边只和关联的割集
- 在我们构造出来的图中,最小割必然是简单割
如果最小割不是简单割,那么割集中必然包含了的边,这和最小割定义冲突,所以最小割是简单割
- 闭合图和简单割一一对应
- 简单割对应闭合图
一个简单割不存在边,所以分割得到的点集所连出的点也在相应点集内,简单割对应闭合图
- 闭合图对应简单割
假设割集中存在的边,那么对于某个点,它连出的点必然不在相同点集内,就不能构成闭合图,所以闭合图对应简单割
割集把原网络分为两部分,令为和源点相连的点集,为与汇点相连的点集
分别表示对应点集中的点权为正或者负的点子集
可以得到一个割集的权值和为:
因为正权点都和源点连边,负权点都和汇点连边,所以在中的负权点都是和割开的点,在中的正权点都是和割开的点
- 最小割的割集形成的点集和中,就是最大权闭合子图中的点,且最大权值和为所有正权点的权值和减去最小割
可以发现,割集中和相连的边都是不选的正权点,和相连的都是不选的负权点
而原图中的正权点的权值和是定值,所以只要最小化割集的容量即可,所以答案就是最小割
1.定义 |
定义一个无向图的密度为边数和点数的比值,即
无向图的最大密度子图为无向图的一个子图且具有最大的
举个栗子:

图中红色的点和边构成了最大密度子图,密度为
2.算法 |
可以把问题转化为求
其中,如果是表示在子图中,表示不在子图中并且如果边子图中,边的两个端点也必然在子图中
我们假设最优的密度为,那么构造一个函数
假设最优密度为,可以得到:
所以可以二分密度,问题转化为如何找到的最大值
可以发现对于每条边,要加入子图中的前提是都在图中,所以容易发现这可以用最大权闭合图来解决
- 每条边作为一个点,向这条边的两个端点连的边
- 源点向所有原图中的边连边,容量为
- 原图中的点向汇点连边,容量为
.png)
二分的上下界分别为和
例题:POJ3155 Hard Life
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?