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

    引入

    例题https://www.luogu.org/problem/show?pid=2762,这是一道求最大权问题,相似的问题有很多,下面就以这道题为例,探究这样的题的做法。

    题意

    题目中有“实验”,做实验有一定的收益ai。做实验需要实验器材,花费为bi。求最大收益。

    求解

    1、转化

    因为每个a都要有几个b与他相连,那么我们可以连成边。连边建图。然后呢就形成了一个闭合图。

    这里引入闭合图的概念:在一个图中,我们选取一些点构成集合,这个集合记为V,且集合中的出边,所指向的终点也在V中,则我们称V为闭合图。通俗一点,就是这个集合V的点,只向V的内部的点连边。

    最大权闭合图:在所有闭合图中,集合中点的权值之和最大的V,我们称V为最大权闭合图。即:权值之和最大的闭合子图。

    根据定义:那么我们也就是求最大权闭合图。(这一点要理解好)

    下面就是一个闭合图,仔细看一下,确实是满足上述性质。但是这不是权值最大的闭合图。

    这图中闭合图还有{5}、{2,5}、{4,5}、{2,4,5}、{3,4,5}、{1,2,3,4,5}、{1,2,4,5}

    最大权闭合图为{3,4,5}。

    闭合图

    2、求解

    然后我门将要在闭合子图中求解。

    构造网络图:构造一个源点S,汇点T。我们将S与所有权值为正的点连一条容量为其权值的边,将所有权值为负的点与T连一条容量为其权值的绝对值的边,原来其他的边将其容量定为正无穷。

    网络图

    先说一下结论:最大权闭合子图的权值等于所有正权点之和减去最小割

    即在图上求出最小割。

    下面证明。

    1.最小割一定是简单割

    简单割指得是:割集的每条边都与S或T关联。即任意一条割集中的边(u,v),一定是 u=S或者v=T。

    证明:因为在图中所有不是不与S或者T相连的边都是正无穷,有正无穷的割一定不是最小割,所以最小割是简单割。

    2.简单割一定和一个闭合子图对应

    闭合子图V和源点S构成N集,其余点和汇点T构成M集。

    首先证明闭合子图是简单割:若闭合子图对应的割不是简单割,则存在一条边(u,v),u∈N,v∈M,且c(u,v)=∞。说明(u,v)这条边的终点不在集合V中,也就不是闭合图,产生矛盾。

    然后证明简单割是闭合子图:对于V中任意一个点u,u∈N。u的任意一条出边c(u,v)=∞,不会在简单割的割边集中(割边只有(s,v)(u,T)这样的边),因此v不属于T,v∈S。所以V的所有点均在S中,因此N-是闭合子图。

    重点:证明最大权闭合子图的权值等于所有正权点之和减去最小割。

    根据上面的结论,等量代换一下,最小割=简单割,简单割=闭合子图,所以:闭合子图=最小割。最小割也对应了一个闭合图。

    然后证明最小割就是最大权的闭合子图。

    集合N表示为S所在的集合,M表示为T所在的集合。

    首先一个割的容量C = M中所有正权点的权值之和 + N中所有负权点的权值绝对值之和。(x1+y1)(解释一下,S与所有权值为正的点连边,T与所有权值为负的点连边,所以:M中正权点的权值之和,就是割边,同理N中所有负权点的权值绝对值之和也还是割边)

    闭合子图的权值和W = N中所有正权点的权值之和 - N中所有负权点的权值绝对值之和。(x2-y2))(解释一下:加一个负数相当于减去这个数的绝对值)

    然后y1=y2(都是一样的)

    所以x1+x2=W+C

    x1+x2就是整张图中所有正权值点的权值之和(上面的字)。

    x1+x2可以输入时就求出来,设x1+x2 = tot

    那么tot=W+C

    W = tot - C;

    要求最大权闭合图,使权值最大,tot又是定值,所以让C最小就好了,求最小割(最大流)就行了,到这里,最大权闭合子图的权值就转化成了求最小割的问题。

    题解

    建图:实验是正权值的点(有获益),器材是负权值的的点(建造需要成本),每个人有两个所属的中转站,实验和器材之间有边。

    这样就形成了一个闭合图,然后按上面的做就行了。

     代码戳这http://www.cnblogs.com/mjtcn/p/7358314.html

    补充

    求最小割的意义。

    对于原题,我们可以见下面一张图。

    求最小割其实就是求最少的花费,设sum是所有实验的带来的收益和,那么sum把所有的收益加起来了,减去最小花费就是最大获益了,这就是为什么求最小割了。

    所以:最小割是花费,要让花费尽量小。

    那么求最小割了,设最小割是mincut花费,随后要用sum-mincut:

    • 首先中间的是一定不能切的,切一条绿边的花费就是正无穷了!!!
    • 切右边的橙色的边表示:所有与这个相关的实验的收益不要了
    • 切左边的蓝边:与这个相关的器材买,收益要(mincut+器材的价格,然后sum再减去,减去成本)

     

    总结

    推荐:胡伯涛 《最小割模型在信息学竞赛中的应用》

  • 相关阅读:
    学习Java书籍推荐和面试网站推荐
    Java 多线程学习扩展
    Java Excel 导入导出(二)
    Java Excel 导入导出(一)
    Matplotlib库(二)
    Matplotlib库(一)
    【转】MATLAB导出精美的论文插图
    图像的手绘效果
    Numpy库的使用(二)
    Numpy库的使用(一)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7359505.html
Copyright © 2011-2022 走看看