zoukankan      html  css  js  c++  java
  • [BZOJ 1497][NOI 2006]最大获利(最大权闭合子图)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1497

    分析:

    这是在有向图中的问题,且边依赖于点,有向图中存在点、边之间的依赖关系可以考虑最大权闭合子图

    假设a与b之间有权值为c的边(根据题意是双向边)

    那么我们可以建一个新节点,点的权值为c,并指向a点和b点(单向),同时断掉原本a,b之间的双向边,a,b的点的权值是它们的花费(负的)

    那么对于原问题就转化成了求最大权闭合子图的问题了

    ————————————————————————————————————————————————————————————————

                               最大权闭合子图

    定义:有向图中选出一个点集V',必须满足对于V‘中的每个点,它的后继也在V’中,选出所有点权值和最大的点集V‘

    算法:

    弄一个源点S,汇点T,S连向所有权值为正的点,容量为点的权值,所有权值为负的点连向T,容量为点的权值的绝对值。

    最后ans=图G中所有权值为正的节点的和-最小割

    证明:http://wenku.baidu.com/link?url=Q7LKOvCRFeMQkY1WulrZTAHjN3ud8gbhuqUOKwPbwmGDAmCB0_URdEkJ59WKWVRGn9xSg9TgbWSmhhBIMxvGS2wMbENrxre6ZuSeO2v3mX7

    然后这里我也来说一说:

    1、首先因为原图中的边全是+inf,所以割边一定是S连出的边或者连向T的边

    2、假设最小割割完后,S所在集合为A,T所在集合为B,那么A和B一定是闭合子图(S,T点除外)

    因为如果假设A不是闭合子图,那么就说明A中的某一个节点的后继在B中,也就说明最小割把这条边给割掉了,但是原图中的边全是inf,所以不可能被割掉,所以假设不成立,所以A一定是闭合子图,B也一定是闭合子图(同理)

    3、接下来我们只要说明对于最小割情况下的A集合,一定是最大的闭合权子图

    对于随便任意一个割C(当然还是不会割掉容量inf的边)

    则C为B中所有权值为正的点权和(即S连出的边被割掉的总量)+B中所有权值为负的点权绝对值和(即连向T的边被割掉的总量)(C=x1+y1)

    设A集合对应的闭合图的权值和W,则W=A中权值为正的节点的权值和-A中权值为负的节点的权值绝对值和(W=x2-y2)

    相加得W+C=x1+x2+y1-y2

    y1和y2显然相等

    所以W+C=x1+x2=原图中所有权值为正的点权和(这是个常数!)

    所以C越小,W就越大,于是就相当于求最小割了

    ——————————————————————————————————————————————————————————————————

    其实这一题有更优的算法,详见2007年集训队论文

  • 相关阅读:
    c++ Oracle OCCI 编程
    linux库文件
    C/C++学习笔记 vector 和map基本操作总结
    linux 后台开发类常见问题及知识点
    Libmicrohttpd简介
    linux系统编程之进程(一):进程与程序
    回调函数
    va_start和va_end使用详解
    new在c#方法中的使用
    Android Studio快捷键
  • 原文地址:https://www.cnblogs.com/wmrv587/p/4307601.html
Copyright © 2011-2022 走看看