zoukankan      html  css  js  c++  java
  • 最大密度子图

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

  • 相关阅读:
    IIS7开启目录浏览功能
    IIS7文件无法下载问题处理
    Dubbo端口占用错误信息
    PlSqlDev中执行INSERT SQL语句包含&符号导致数据异常
    VMWare版本兼容问题处理
    手动释放Linux内存
    ORA-00972_标识符过长
    通过API获取统计信息时报Access denied错误处理记录
    微信小程序中跳转另一个小程序
    css怎样去掉多个Img标签之间的间隙
  • 原文地址:https://www.cnblogs.com/Vikyanite/p/13672434.html
Copyright © 2011-2022 走看看