zoukankan      html  css  js  c++  java
  • 最大权闭合子图

    引用来自http://www.cnblogs.com/wuyiqi/archive/2012/03/12/2391960.html的思想;

    首先有一个有向连通图,每个点带有一个权值,例如:

    此时,构建一个超级源点s,一个超级汇点t,所有的点按权值的正负连接到s和t上,转换成一个边权值有向图,如下图:

    (注:点权为0的点可以忽略,对结果没有影响)

    这时,可以得到小结论:

    ①该带边权有向图的关于s-t最小割,是简单割;

      简单割:割集中所有的边,都与s或t相连接。

      显然的,因为不与s,t相连的边,权值都是INF,最小割不可能割在INF的边上;

      这早在文章http://www.cnblogs.com/dilthey/p/7401563.html中就有出现提到过,实际上,这个带边权有向图就是二分图;

    ②该图中的每一个简单割产生的两个子图,我们记含有点s的是图S,含有点t的是图T,则图S是闭合图;

      闭合图:在一个图中,我们选取一些点构成集合,若集合中任意点连接的任意出弧,所指向的终点也在V中,则这个集合以及所有这些边构成闭合图。

      证明:简单割内不包含边权为INF的边,即不含有连通两个图的边(除了连接在t点上的边之外);

         即,图S中没有边与图T连通,那么,所有的边都只能连接在图S之内,即为闭合图。

      样例:

              

    ③最小割产生的图S和图T,图S为最大权闭合子图;

      最大权闭合子图:在整个图中,有多个子图是满足闭合图的条件的,其中点权值之和最大的,为最大权闭合子图;

      因为割集中所有的边,不是连接在s上,就是连接在t上;

      我们记割集中,所有连接在s上的边的权值和为x1,所有连接在t上的边的权值和为x2,而割集中所有边权值和为X=x1+x2;

      又,记图S中所有点的权值和为W,记其中正权值之和为w1,负权值之和为 - w2,故W = w1 - w2;

      而 W + X = w1 - w2 + x1 + x2,由于x2 = w2

        (因为图S中所有负权值的点,必然连接到t点,而图S必然要与t分割开;故割集中,“连接在t点上的边权值和”就是“图S中所有负权值点的权值之和,取负”)

      因而W + X = w1 + x1;

      而显然的,w1 + x1是整个图中所有正权值之和,记为SUM;

      故W = SUM - X,即 “图S中所有点的权值和” = “整个图中所有正权值之和”  - “割集中所有边权值和”;

      然后,因为SUM为定值,只要我们取最小割,则“图S中所有点的权值和”就是最大的,即此时图S为图S为最大权闭合子图;

    最后,我们就有了求解这类问题的完整思路:

      ①先记录整个图中,所有正点权值的和;

      ②建立对应流网络,求最大流,最大流在数值上等于最小割,故我们得到了流网络的s-t最小割;

      ③“所有正点权值的和”减去“s-t最小割”,即得最大权闭合子图的权值和。

  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/dilthey/p/7565206.html
Copyright © 2011-2022 走看看