一些简单的网络流模型

一、最大权闭合图

对于一个图(V, E)由点集V和一些有向边集E组成,每个点有一定权值,对于一个合法子集,若有一条有向边(u,v)并且u在子集中,则v也必须在子集中,求子集中所有元素权值和最大的子集

分析:考虑每个点有两种状况,选和不选,所以考虑最小割,但是要求最大费用;

先假设取了所有正权点,从原点向所有正权点连边,从所有负权点向汇点连边,容量为权值的绝对值,

对于一个割[S,T](S内的点表示选择了的点),

正权点在S内,表示选了这个点,与S相连的边没有被割,若在T内,表示这个点被割则被割,此时权值应减去这条割边,

同理,对于负权点,一开始没有选他,若在S内,则到T的连边被割,权值减去费用,若在T内,仍然没有被选,与T的连边没有被割,则权值不变

考虑限制

按照上面的方式选出来的S内的点在原图中是不能与T中的点有边的,换一种说法,与T中连边的代价是INF,那么对于原图中的有向边连一条起点终点相同容量为INF的边,若起点属于S终点属于T则这条边在割中,代价为INF,这样最小割中必然不包含这条边,也就是说,最小割分得的S集所在的点一定没有与T中的点的连边。

实际上是很好理解这种一一对应关系的,严格的证明可以参见《最小割模型在信息学竞赛中的应用》——胡伯涛

另外 为什么要说与T中连边的代价是INF呢?

因为这里可以灵活一下,可以不是INF,比如bzoj1391 [Ceoi2008]order这道题把INF改成租借的费用就可以啦。

二、二分图的最小点权覆盖集

对于一个图(V, E)由点集V和一些无向边集E组成,每个点有一定权值,对于一个合法子集,若有一条无向边(u,v)则u,v至少有一个点在子集中,求子集中所有元素权值和最小的子集

设二分图的两边为X和Y,并且下面提到的(u,v)u属于X,v属于y

对于一条边(u,v),从s到u连一条容量为val(u)的边,从v到t连一条容量为val(v)的边对于一个割[S,T],从u到v也连一条边,由于割的性质是不存在一条从S到T的路径,所以这三条边至少有一条被割,我们不希望u到v的边在最小割中被割,所以给流量为INF

若Y中的点在S内,则与T的连边必然被割(代表选了这个点),在T内则没有被割(代表没选这个点),

若X中的点在T内,则与S的连边必然被割(代表选了这个点),在S内则没有被割(代表没选这个点)。

将所有的X在T中的点和T在S中的点选出来,一定是一个覆盖集,因为s->u和u->t两条边至少有一条被割

那么最小割就是答案啦

特别地,如果每个点权都是1的话,我们发现建的图和二分图最大匹配建的图是一样的,这也是二分图最大匹配数=最小点覆盖的原因。

三、二分图最大权独立集

容易证明每一个覆盖集的补集都是一个独立集,每个独立集的补集也是一个覆盖集,所以用总的权值减去最小覆盖集就行啦。。

特别地,这也是为什么二分图最大匹配数=n-最大独立集的原因。

时间: 2024-10-01 07:07:14

一些简单的网络流模型的相关文章

poj 2391Ombrophobic Bovines 【蛮简单的网络流】

...第一个网络流的题目 牛淋雨什么的,建图,用模板之 #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <vector> using namespace std; long long F,P; long long cowsum;

一个简单的MVC模型实现

function Event(sender) { this._sender = sender; this._listeners = []; } Event.prototype = { attach : function (listener) { this._listeners.push(listener); }, notify : function (args) { var index; for (index = 0; index < this._listeners.length; index

一类判定性问题的网络流模型的构建

一般我们的最大流算法解决的是最优化问题.即通过某种构图方法,使得最大流的流量即为我们所要求的的最大值. 但是,一类判定性问题也需要通过网络流模型来解决. 经典的问题有:混合图的欧拉回路,等等. 这类问题往往通过构建一个网络图,计算出其最大流,然后根据判断最大流是否满足某种条件来判断.当然,二分答案的时候也可能会用到这种方法. (完)

学习笔记(九)Filter 完成一个简单的权限模型 HttpServletWrapper 和 HttpServletResponseWrapper

2. HttpServletWrapper 和 HttpServletResponseWrapper 1). Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象,HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法, 这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法 //包装类实现 ServletRequest 接口. publ

使用C++实现一套简单的状态机模型——实例

一般来说,"状态机"是一种表达状态转换变换逻辑的方法.曾经有人和我讨论过为什么不直接用ifelse,而要使用"状态机"去实现一些逻辑,认为使用"状态机"是一种炫技的表现.然而对于大型复杂逻辑的变化和跳转,使用ifelse将带来代码难以阅读等弊端.其实ifelse也是一种状态机实现的方式. 之前我们有个业务和操作系统有着强烈的关联,而我们希望比较清晰地描述整个业务中各个子业务的过程,就引入了状态机描述的方式.可是当时的状态机是使用if else方法

使用C++实现一套简单的状态机模型——原理解析

在上一文中,我们介绍了该状态机模型的使用方法.通过例子,我们发现可以使用该模型快速构建满足基本业务需求的状态机.本文我们将解析该模型的基础代码,以便大家可以根据自己状态机特点进行修改.(转载请指明出于breaksoftware的csdn博客) 该模板库的基础方法实现在之后给出的工程的AutoStateChart.h中,该文件一共215行,其中有16行是辅助调试代码.以上一文中状态机类为例: class CMachine_Download_Run_App : public AutoStateCha

CI 搭建简单的MVC模型示例

1.下载CI框架源码 http://codeigniter.org.cn/download 2.我们主要的开发在application 文件夹进行,可以自己根据项目重命名文件夹.(例如公司名称_application,公司名称_system) 3.application->config 里面可以配置相关的内容(以后慢慢添加),数据库的连接配置在database.php 文件夹, $db['default']['hostname'] = 'localhost'; $db['default']['u

[您有新的未分配科技点]博弈论进阶:似乎不那么恐惧了…… (SJ定理,简单的基础模型)

这次,我们来继续学习博弈论的知识.今天我们会学习更多的基础模型,以及SJ定理的应用. 首先,我们来看博弈论在DAG上的应用.首先来看一个小例子:在一个有向无环图中,有一个棋子从某一个点开始一直向它的出点移动,双方轮流操作,无法操作者输,问是否先手必胜. 考虑一下我们之前的Nim游戏,如果我们把后继状态看成后继点的话,不难发现Nim游戏的互相转移也是一个DAG.因此,DAG上出度为0的点的sg值为0,再用上一篇博客提到的mex操作来求每个点的值就可以了(注意,这并不是一个"大"子图,不能

UDP协议----简单的CS模型实现

UDP简单介绍 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议.TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输.但UDP也是网络通信中不可或缺的重要通信手段. 相较于TCP而言,UDP通信的形式更像是发短信.不需要在数据传输之前建立.维护连接.只专心获取数据就好.省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证.因此,我们称UDP为"无连接的不可靠报文传递". 那么与我们熟知的TCP相比,