最大密度子图

前置技能: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的双向边

 

posted @   ViKyanite  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· 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训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
主题色彩