最大密度子图
前置技能:01分数规划, 最大权闭合子图
图片源自网上:https://blog.csdn.net/corsica6/article/details/88200297
说说我自己对这个“最大密度子图”的理解吧。#
关于算法一:#
1. 为什么是求h(g) = E - gV(这里的E代表的是∑E,V同理)
因为我们假设g就是我们所求的最大值,那么有 E/ V <= g。之后我们移项一下就是E - gV了。
2. 为什么判断条件是m - Dinic() > 0,且改变的是左边界
这一天是从上一条来的,上一条移项之后就是E - gV <= 0。
之后我们分析这个式子,如果选择一条边那么就一定会选其对应的点从而付出g或2g的代价。这不就是最大权闭合子图吗?
所以我们就可以建边了将每个点连向T,权为g代表需要付出g的代价。每条边抽象的点连向S权为1,代表的是收益。边对应的点连inf
之后就是最大权闭合子图 =(正向权相加)m - Dinic()。算是利用最大权闭合子图的性质来求E - gV,间接求得最大密度子图。
之后一旦不满足E - gV <= 0,即m - Dinic() > 0 那么说明g太小,所以是将左边界变大。
关于算法二:
一个显然的决策。。就是如果我们已经选定了一个点集,两点都在点集内的边一定要选。。。于是边数就可以看做(至少有一点在点集内的边)-(只有一点在点集内的边)
而(只有一点在点集内的边)相当于点集与其补集的最小割。。。
于是先转化最大化h(x)为最小化 -h(x)
也就是最小化(点数)* g - (至少有一点在点集内的边)+(只有一点在点集内的边)
也就是 (点数)* g - ((选的点的度数之和)/2 - 割)
把系数1/2给去掉。。就变成 2 (点数) g -((选的点度数之和) - 2 * 割)
于是建图就是。。
顺便一提推广的建图方式:
注意这里的c(u,v)建的是容量为w的双向边。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人