zoukankan      html  css  js  c++  java
  • 最小割

    转自mjmjmtl大牛:

    一、基本问题:
    1.到底什么是割:原始点集为V,选出一些点集S使得s∈S,T=V-S,t∈T,则S到T的边为S到T割,记做[S,T]。
    2.什么是最小割:图中所有的割中,边权值和最小的割为最小割!
    3.割得容量容量和流量计算的区别:割[S,T]的容量为∑(边(u,v)的容量和),其中u∈S,∈T。也就是说割的容量不计算反向的边!!而流量为正向的和反向的代数和。
    4.最大流-最小割定理:最大流的值为最小割的容量!
    5.怎样求割:求完最大流后,在残留网络中从source开始dfs,被染色的为S,未被染色的为T,则边集[S,T]为割。(或者从sink反向dfs,被染色的为T,未被染色的为S,边集[S,T]为割)这种思想应该没有错误,我曾经证明过,正向和反向floodFill都能得到合适的解。然而我按照逆向floodFill提交了两道special judge的题,都没有AC!分别是spoj839和poj2125(其中poj2125的SPJ有问题,一会AC一会WA),然而,对于spoj839我自己对我的逆向floodFill答案和正向floodFill答案做了对比(如果有区别,在程序中会死循环),发现二者没有区别。感觉是SPJ的问题。这一点,暂且放置,以后再次看到了再说。
     
    二、一些割的性质:
    1.割[S,T],流量只能从S流向T,不能从T流向S!(在最大流后找割dfs时其实就满足这个性质,假设T中一个点v流向S中的一个点u,那么u到v有负流量,则u到v的残留网络严格大于0。反向dfs证明类似
    2.最大流后,割边一定满流。减小某一割边后,网络流减小。
    3.如下图,从s沿着残余流量dfs,得到点集S;同理沿着t反向dfs,得到点集T;剩下的是M。分界线cut1和cut2是其中一割,边自然为割边。然而在M中还存有割边(一定存有!!否则M就没用了!)
    4.退化一下:如下图所示,S和T有相邻部分边集E1,S和M重合边集相邻部分边集E2,M和T相邻边集部分E3,那么直接升高E1中某条边的容量,会使整体容量直接增高!反之:而如果增大S和M相邻的割边或者M和T相邻的割边,网络流不直接增大,因为M中还存有割边限制
    5.继续退化:如果M==空集,cut1和cut2重合(变为cut),则网络中割唯一。可以通过 if ( |S|+|T|==总点数) 来判断
     
     
    三、割的三个典型应用(参考《最小割模型在信息学竞赛中的应用》):最大权闭合图、最大密度子图、二分图的最小点权覆盖(二分图的最大点权独立集)
  • 相关阅读:
    前端插件之Datatables使用--上篇
    Django websocket之web端实时查看日志实践案例
    前端插件之Select2使用
    前端插件之Bootstrap Dual Listbox使用
    简单易落地且对运维友好的配置中心方案
    Devops-运维效率之数据迁移自动化
    中小团队基于Docker的Devops实践
    nginx第七篇:Nginx集群(负载均衡)、集群介绍、构建集群、nginx默认分发算法、nginx基于请求头的分发算法
    nginx之旅(第六篇):nginx优化--nginx优化目的、工作进程优化、长连接设置、数据压缩、客户端缓存
    nginx之旅(第五篇):URL重写介绍、URL重写场景、URL重写语法
  • 原文地址:https://www.cnblogs.com/pony1993/p/2718537.html
Copyright © 2011-2022 走看看