POJ-1087(最大流+EK算法)】的更多相关文章

序: 既然是个图,并且求边数的最大值.那么这就可以转化为网络流的求最大流问题. 只需要将源点与其中一子集的所有节点相连,汇点与另一子集的所有节点相连,将所有弧的流量限制置为1,那么最大流 == 最大匹配.(感谢yulemao大神的指点) 只需要在初始化的时候修改一下,就可以直接用求最大流的算法模板了. 本文代码使用EK算法, 为POJ 1469的AC代码. EK算法解析 源代码: /* About: 二分图最大匹配_网络流EK算法 2017/04/22 */ #include <iostream…
之前一直觉得很难,没学过网络流,毕竟是基础知识现在重新来看. 定义一下网络流问题,就是在一幅有向图中,每条边有两个属性,一个是cap表示容量,一个是flow 表示流过的流量.我们要求解的问题就是从S点到T点最多可以跑多少流量.用比较学术的话说,就是 一个有向图 G=(V,E):有两个特别的点:源点s.汇点t:图中每条边(u,v)∈E,有一个非负值的容量C(u,v),流量F(u,v). 定义一下"残流网络":即当前边还可以流过的流量,也就是cap-flow. 其中,在最大流的问题中,我们…
一.算法理论 [基本思想] 反复寻找源点s到汇点t之间的增广路径,若有,找出增广路径上每一段[容量-流量]的最小值delta,若无,则结束.在寻找增广路径时,可以用BFS来找,并且更新残留网络的值(涉及到反向弧).而找到delta后,则使最大流值加上delta,更新为当前的最大流值. [算法详解] 这么一个图,求源点1到汇点4的最大流. 由于我是通过模版真正理解ek的含义,所以先上代码,通过分析代码,来详细叙述ek算法. #include <iostream> #include <que…
网络流 网络流是模仿水流解决生活中类似问题的一种方法策略,来看这么一个问题,有一个自来水厂S,它要向目标T提供水量,从S出发有不确定数量和方向的水管,它可能直接到达T或者经过更多的节点的中转,目前确定的是每条水管中水流的流向是确定的(单向),且每个水管单位时间内都有属于自己的水流量的上限(超过会爆水管),问题是求终点T单位时间内获得的最大水流量是多少?如下图: 1. 首先,我们用正常的思路去解决这个问题,对于上图的情况而言,我们可以先选择一条水流的路线1->2->4,而且我们得知1->2…
序: 在之前的文章中实现了不利用STL实现EK算法,效率也较高.这次我们企图简化代码,减少变量的使用与手写模拟的代码. 注意:vector等STL的container在不开O2优化的时候实现同一个效果普遍比手写要慢. 源代码如下: /* About: Max_flow_EK_vector Auther: kongse_qi Date:2017/04/22 */ #include <bits/stdc++.h> #define INF 0x3f3f3f #define maxn 20005 #d…
最近学了下最大流算法,大概思想算是懵懵懂懂了,现在想把模板记录下来,以备后面深刻学习之用. #include<cstdio> #include<cstring> using namespace std; #define _clr(x, y) memset(x, y, sizeof (x)) #define Min(x, y) (x < y ? x : y) #define INF 0x3f3f3f3f #define N 210 int map[N][N]; int pre[…
Power Network POJ-1459 这题值得思索的就是特殊的输入,如何输入一连串字符.这里采用的方法是根据输入已知的输入格式,事先预定好要接受的数据类型. 这里套用的板子也是最大流的模板,但是虽然可以ac但是时间有点卡,所以如果可以的话还是使用高级的算法. #include<iostream> #include<algorithm> #include<fstream> #include<cmath> #include<algorithm>…
转自:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html 图-1 如图-1所示,在这个运输网络中,源点S和汇点T分别是1,7,各边的容量为C(u,v).图中红色虚线所示就是一个可行流.标准图示法如图-2所示: 其中p(u,v) / c(u,v)分别表示该边的实际流量与最大容量. 关于最大流 熟悉了什么是网络流,最大流也就很好理解了.就是对于任意的u∈V-{s},使得p(s,u)的和达到最大.上面的运输网络中,最大流如图-…
套了个EK的模板 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <climits> #include <cstring> #include <cmath> #include <stack> #include <queue> #i…
  Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 24788   Accepted: 12922 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied with an amou…
给定一个有向图G=(V,E),把图中的边看作 管道,每条边上有一个权值,表示该管道 的流量上限.给定源点s和汇点t,现在假设 在s处有一个水源,t处有一个蓄水池,问从 s到t的最大水流量是多少? 网络流图里,源点流出的量,等于汇点流 入的量,除源汇外的任何点,其流入量之 和等于流出两之和. 下面我们来考虑如何求最大流. 首先,假如所有边上的流量都没有超过容量(水管),那么就把这个流,称为一个可行流.易见,任一网络中都有一个零流,即每弧a上f(a)=0的流f. 我们就从这个零流开始考虑,假如有这么…
#include<stdio.h> #include<string.h> #define N 300 #define inf 0x7fffffff #include<queue> using namespace std; struct node {   int u,v,w,next; }bian[N*4]; int head[N],yong,d[N],s,t; void addedge(int u,int v,int w) {    bian[yong].u=u;  …
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532 思路: 网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替换“=”. 对网络流不熟悉的,给一篇讲解:http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html. ✧(≖ ◡ ≖✿)我是看这篇博客才入门的. 代码: #include <cstdio> #include <cstring> #inclu…
A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15597   Accepted: 5308 Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an int…
A Plug for UNIX POJ-1087 这一题也是最大流的应用,但是题目有点绕. 题目的意思就是有插座和插头,只不过这里使用设备取代了插头.只有插座和设备进行匹配了. 题目要注意的是那个适配器的问题,适配器给出的是 A,B 的模式,但是这里并不是指A可以取代B而是指B可以取代A,所以建图的时候要注意这个细节. 还有一个问题就是题目的规模是未知的,所以maxn尽量设置的较大,这样才保险. #include<iostream> #include<algorithm> #inc…
Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点,一个点和食物匹配,另一个点和饮料匹配.另外增加一个源点和一个汇点.最后根据题目的输入来连边就可以了.容量统一设置为1. #include<iostream> #include<cstdio> #include<cstring> #include<string>…
没啥好说的,慢慢建图 Sample Input 4 A B C D 5 laptop B phone C pager B clock B comb X 3 B X X A X D Sample Output 1 题意:有n个不同的插座,有m台不同的机器需要m种插头,有k组转换:插头A能由插头B转换而来.问这些机器最少有几台不能插上插座. #include<cstdio> #include<iostream> #include<algorithm> #include<…
Drainage Ditches Problem Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has…
前言 EK算法是求网络最大流的最基础的算法,也是比较好理解的一种算法,利用它可以解决绝大多数最大流问题. 但是受到时间复杂度的限制,这种算法常常有TLE的风险 思想 还记得我们在介绍最大流的时候提到的求解思路么? 对一张网络流图,每次找出它的最小的残量(能增广的量),对其进行增广. 没错,EK算法就是利用这种思想来解决问题的 实现 EK算法在实现时,需要对整张图遍历一边. 那我们如何进行遍历呢?BFS还是DFS? 因为DFS的搜索顺序的原因,所以某些毒瘤出题人会构造数据卡你,具体怎么卡应该比较简…
<题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量,接下来就是n行数,每一行分为x1,x2,x3:x1,x2为节点的序号,x3为流量:然后问从1号节点到m号节点的最大流是多少? 解题分析: 网络流最大流裸题,下面用的是EK算法,bfs起搜索增广路径的作用,EK算法比较难理解的地方就是反向边的构造. #include <cstdio> #inclu…
本来是继续加强最短路的训练,但是遇到了一个最短路 + 最大流的问题,最大流什么鬼,昨天+今天学习了一下,应该对ek算法有所了解,凭借学习后的印象,自己完成并ac了这个最大流的模板题 题目大意:都是图论,只是这个图给你的关系是网络关系,就是从s到t的路上,你运送的东西的量必须满足所有路径的限制,而题目给出的就是限制,我们用一个二维数组c存储i到j这一条边的总限制,注意的是,初始化c数组为0,然后增加限制,而不是赋值,因为可能有多条路,但管他几条路呢,只要能运过去走那条都行,所以合并增值 int m…
题目链接 本篇博客延续上篇博客(最大流Dinic算法)的内容,此次使用EK算法解决最大流问题. EK算法思想:在图中搜索一条从源点到汇点的扩展路,需要记录这条路径,将这条路径的最大可行流量 liu 增加到结果ans中,然后反向从汇点到源点更新这条路径上的每条边的权值(减去此次的liu),同时反向边的权值也需要更新(加上此次的liu).然后再搜索新的扩展路……,循环,直到找不到新的扩展路,此时的ans就是最大流了. 注:EK算法解决最大流时,我看别人都是使用矩阵建立的图,这样反向更新扩展路径上的边…
模板题:洛谷p3376 题目大意: 给出一个网络图,以及其源点和汇点,求出其网络最大流. 基本思路: 套模板 EK的时间复杂度O(V*E^2) EK算法思路: 1.通过BFS拓展合法节点(每个节点在本次BFS中仅遍历一次),找到汇点,并记录每个节点的前面节点(pre)(若找不到增广路,算法结束) 2.通过BFS的记录,从汇点回溯回源点,记录下每条弧流量的**最小值**minn, ans += minn(否则就会超出某条边的限制流量) 3.将所有经过的边的流量减去minn,反向边加上minn 4.…
最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include <iostream> #include <cstring> #include <queue> #define INF 0x3f3f3f3f using namespace std; int n,m; int cap[202][202],flow[202][202],mf[2…
题意: 2 1 1 2 (0,1)20 (1,0)10 (0)15 (1)20 2 1 1 2 表示 共有2个节点,生产能量的点1个,消耗能量的点1个, 传递能量的通道2条:(0,1)20 (1,0)10 代表(起点,终点)最大传递的能量 (0)15 (产生能量的点)产生的最大能量(1)20 (消费能量的点)消费的最大能量 初学网络流,我想从基础练起:就先用EK算法写一遍 这道题看似很难,但其实只要加一个源点以及汇点,让所有的产生能量的点指向源点,让所有的消费能量的点指向汇点: #include…
POJ 1087 A Plug for UNIX / HDU 1526 A Plug for UNIX / ZOJ 1157 A Plug for UNIX / UVA 753 A Plug for UNIX / UVAlive 5418 A Plug for UNIX / SCU 1671 A Plug for UNIX (网络流) Description You are in charge of setting up the press room for the inaugural meet…
题目链接:http://poj.org/problem?id=1273 a.EK算法:(Edmond-Karp): 用BFS不断找增广路径,当找不到增广路径时当前流量即为最大流. b.dinic算法:不断找最短路. 题意:现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条水渠,给出这n条水渠所连接的池塘和所能流过的水量,求水渠中所能流过的水的最大容量. //http://blog.csdn.net/huzhengnan/article/details/7766446一个写的特别好的博…
一般预流推进算法: 算法思想: 对容量网络G 的一个预流f,如果存在活跃顶点,则说明该预流不是可行流. 预流推进算法就是要选择活跃顶点,并通过它把一定的流量推进到它的邻接顶点,尽可能将正的赢余减少为0. 由于算法最终目的是尽可能将流量推进到汇点Vt,因此算法总是首先寻求将流量推进到距离汇点Vt 最近的邻接顶点中. 由于每个顶点的距离标号可以表示顶点到汇点Vt 的距离,因此算法总是将流量沿着允许弧推进. 如果从当前活跃顶点出发没有允许弧,则增加该顶点的距离标号,使得从当前活跃顶点出发至少有一条允许…
题意: 每个电脑需要P个组成部分,现有N的机器,每个机器都可以对电脑进行加工,不过加工的前提是某些部分已经存在,加工后会增加某些部分.且在单位时间内,每个机器的加工都有一个最大加工容量,求能得到的最大的流量,并且输出流经的所有路径. 思路: 最大流,EK算法.先建图,这里用邻接矩阵能比较简洁,由于每个机器(点)有权值,所以拆点,中间由与其权值想等的边连接,然后两两匹配,看是否能构成边. 代码: #include<iostream> #include<algorithm> #incl…
引理: EK算法每次增广使所有顶点$v\in V-\{s,t\}$到$s$的最短距离$d[v]$增大. 采用反证法, 假设存在一个点$v\in V-\{s,t\}$, 使得$d'[v]< d[v]$. 取$v$为第一个使最短距离减小的点, 设增广后的图$G'$中路径$s\leadsto u \rightarrow v$为$s$到$v$的最短路 因此可以得到 $$d[u]=d[v]-1, d'[u]\ge d[u]$$ 那么显然边$(u,v) \notin E$, 因为若$(u,v) \in E$…