用网络流建模解决最大密度子图问题

news/2025/2/13 13:42:52/文章来源:https://www.cnblogs.com/ofnoname/p/18712938

在图论中,子图是由原图的一部分节点和这些节点之间的边构成的图。图的密度通常是指图中边的数量与节点的数量之比。形式化地,对于一个图 $ H = (V, E) $,其密度定义为:

\[\text{密度}(H) = \frac{|E|}{|V|} \]

其中,$ |E| $ 表示图 $ H $ 中的边的数量,$ |V| $ 是图 $ H $ 中节点的数量。图的密度即“边数/点数”。

最大密度子图问题要求这样一个目标:从给定的图中找出一个子图,使得该子图的密度最大。

最大密度子图问题在多个领域中都有重要的应用,特别是在社交网络分析、生物信息学、推荐系统等领域。通过找出一个图中最大密度的子图,我们能够捕捉到图中的重要结构或紧密联系的节点子集。这些子集往往包含了图中最具有信息价值的部分。

二分猜测答案和最大流验证

直接求解最大密度子图是一个 NP 难题。但通过网络流构造与二分法,我们可以在多项式时间内高效求解。

假设最大密度为 \(g^*\),我们通过二分猜测一个候选值 \(g\),并检验是否存在子图 \(S\) 达到此密度,通过二分法不断调整 \(g\),直至收敛到 \(g^*\)

网络流构造:将密度检验映射为最小割

对每个猜测的 \(g\),我们构造一个流网络,使得其最小割对应密度至少为 \(g\) 的子图存在性。网络构造如下:

顶点与边的定义

  • 源点 \(s\) 和汇点 \(t\):在原图外新添加两个点,用于划分子图候选集合 \(S\)(与 \(s\) 连通)和非候选集合 \(T\)(与 \(t\) 连通)。
  • 边容量设计:
    1. 源点 \(s\) 到每个顶点 \(v\):容量为 \(m\)(原图总边数)。
    2. 每个顶点 \(v\) 到汇点 \(t\):容量为 \(m + 2g - \text{deg}(v)\)\(\text{deg}(v)\) 为顶点度数)。
    3. 原图中的边 \((u, v)\):拆分为两条有向边 \(u \to v\)\(v \to u\),容量均为 \(1\)

为什么这么做?

  • 顶点到汇点的边:容量 \(m + 2g - \text{deg}(v)\) 平衡了顶点选择的成本。度数高的顶点(可能贡献更多边)到 \(t\) 的容量较低,更容易被保留在 \(S\) 中。
  • 原边的双向容量:若子图 \(S\) 包含边 \((u, v)\),则 \(u\)\(v\) 均属于 \(S\),双向边不会被切割;否则至少一条边被切断,代价为 \(1\),对应损失这条边对密度的贡献。

image

接下来运行最大流最小割算法。

割容量公式

对这样构造的图的任意割 \((S \cup \{s\}, T \cup \{t\})\),其总容量(也等于最小割)为:

\[\begin{aligned} C &= \underbrace{m|T|}_{\text{源到非候选集}} + \underbrace{\sum_{v \in S} \left(m + 2g - \text{deg}(v)\right)}_{\text{候选集到汇点}} + \underbrace{2c(S, T)}_{\text{原边切割}} \\ &= mn + 2g|S| - 2|E(S)| + 2c(S, T), \end{aligned} \]

其中 \(c(S, T)\) 是原图中 \(S\)\(T\) 的边数,\(n\) 为总顶点数。当 \(C < mn\) 时,化简可得:

\[g|S| - |E(S)| + c(S, T) < 0 \implies |E(S)| > g|S| - c(S, T). \]

由于 \(c(S, T) \geq 0\),此时至少存在子图 \(S\) 满足 \(|E(S)| \geq g|S|\),即当前猜测 \(g\) 可行。

若选取的 \(g\) 足够小,到汇点的容量不足,源点出发的所有边不能灌满。最小割顶点更倾向于划入源点以避免高切割代价。当 \(g\) 较大时,容量将总是 \(mn\),当最小割容量首次达到 \(mn\),此时对应的 \(g\) 即为最大密度。此时最小割中所有的点及其互相相连的边刚好贯通所有流量,他们就构成了我们要的最大密度子图。

所以,若当前网络的最小割容量 \(C < mn\),说明存在密度超过 \(g\) 的子图,可尝试增大 \(g\);否则需减小 \(g\)。最终当猜测区间足够小时结束算法,得到答案,而最终最小割对应的顶点集合 \(S\) 即为最大密度子图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/883193.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置snipaste自启动

右键图标 ——》 首选项 ——》开机自启动 参考——https://blog.csdn.net/weixin_45428910/article/details/127798513

PostgreSQL认证是什么,值得考吗

PostgreSQL认证是一种PG数据库能力认证,是对一个人在PostgreSQL方面的知识积累和技能实操的考核,判断此人是否能够胜任PostgreSQL相关工作的一种考核。 由于数据库行业是对技术要求非常高的一种产品,所以在使用之前需要对使用者有一定的要求,PostgreSQL认证就是其中一种方式…

从 Windows Forms 到微服务的经验教训

Photo by Dan Counsell on Unsplash如果说软件开发中有什么不变的东西,那就是变化。 在 .NET 生态系统中摸爬滚打的这二十年里,我见证了各种框架的起起落落,目睹了容器化的崛起,也曾为微服务架构摇旗呐喊——而在几年前,微服务对许多人来说还只是晦涩难懂的概念。 然而,如…

C#之MethodImpl(MethodImplOptions.Synchronized)

[MethodImpl(MethodImplOptions.Synchronized)] 是 C# 中用于指定方法同步的一个特性,它控制方法的执行方式,确保在多线程环境下某个方法的执行是线程安全的。它可以用来避免多个线程同时访问一个共享资源而导致的竞态条件。 private static int count = 0;//[MethodImpl(Met…

如何选择嵌入式主板厂家

选择合适的嵌入式主板厂商需要综合考虑技术、成本、服务等多个维度。以下是系统化的选择策略,结合关键因素和实际场景需求: 一、核心需求分析 1. 性能需求 处理器架构:是否需要x86(高性能计算)、ARM(低功耗)、RISC-V(定制化) 示例:边缘AI推理需选带NPU的ARM板(如…

360浏览器查看项目运行的页面

项目运行在360浏览器后,右键选中属性 之后在地址栏中就可以看到运行的是哪个页面

CTF-web-头等舱

1.打开题目。什么都没有2.查看源代码,还是什么都没有3.Burp抓包看看4.直接得到flag

搭建本地知识库

搭建知识库需要安装嵌入模型,将文件交给嵌入模型处理完后,会将结果存入向量数据库,向量数据库由软件提供,不需要安装,然后由对话大模型调用向量数据库里面的处理结果。嵌入模型:搭建知识库时,通常需要使用嵌入模型。它的作用是将文本数据(从文件解析提取出来的内容等)…

rust学习笔记(8)

cargo cargo是一个用来帮助控制项目开发的工具 cargo.toml 这是一个用来管理项目的文件 首先是[package]部分 [package] name = "foo" version = "0.1.0" authors = ["mark"]三个基本的项目内容然后是[dependencies]部分这个部分的内容是项目需要…

DeepSeek 本地部署后如何联网搜索!

DeepSeek 本地部署后如何联网搜索,小白必看秘籍! 原创 阮小贰 阮小贰 阮小贰 科技自媒体阮小贰,AIGC拓荒人~38篇原创内容2025年02月01日 00:01 广东 还不知道如何进行DeepSeek本地部署的童鞋赶紧去看看这篇文章: 一篇文章带你搞定DeepSeek本地部署下午刚发布完 DeepSe…

C# 深度学习框架 TorchSharp 原生训练模型和图像识别-手写数字识别

目录开始使用 Torch准备 下载数据集 显示图片 加载数据集 定义网络 优化模型参数 训练模型 保存和加载模型 使用模型识别图片 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址:https://torch.whuanle.cn 电子书仓库:https://github.com/whuanle/cs_pytorch Maomi.T…

P3834 【模板】可持久化线段树 2(主席树)

这是一道主席树的模板题,#include<iostream> #include<set> #include<map> #include<algorithm> #include<vector> #include<cmath> #include<climits> #include<cstring> #define int long long const int N = 1e6+5; using…