码迷,mamicode.com
首页 > 其他好文 > 详细

最大密度子图

时间:2020-09-18 01:57:37      阅读:36      评论:0      收藏:0      [点我收藏+]

标签:就是   网上   改变   cors   容量   ini   关于   为什么   details   

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

 

最大密度子图

标签:就是   网上   改变   cors   容量   ini   关于   为什么   details   

原文地址:https://www.cnblogs.com/Vikyanite/p/13672434.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!