随笔分类 -  最大流

摘要:训练的题目最大流题意:题意直白,就是一个网格从(0,0)编号到(N-1,M-1),每个点可以走到和它相连的4个点,没条边都有容量,为你从(0,0)到(N-1,M-1)的最大流1.建图细心一点不要出错,注意检查2.无向图,本来建的是无向图,无端端注释掉一部分,WA了一次才想起来怎么注释掉了,改回来过了3.建图后,直接上最大流模板,这里用EK#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#define N 10100 阅读全文
posted @ 2013-04-30 20:18 Titanium 阅读(176) 评论(0) 推荐(0)
摘要:网络流UVA 1161 是相同的题目这题网上找不到任何题解的,看上去是个最大流,但是最难搞的就是有时间限制,现在基本上能确定的就是要拆点,但是怎么拆不确定,我用了这种拆法就一直超时超时的原因我总结一下有几个可能。1.构图的代码太烂,可能出了什么差错但是找不出来。2.数组开小了?开大了?3.和第1个原因,然后运行EK的时候掉进了死循环或者效率太慢。4.EK太慢,要用ISAP超时的代码/*原本的点从0到n-1标号,但是每个点需要占用2880个空间,所以对于原来第u个顶点,怎么确定那个范围是它可以用的就是[u*2880 , (u+1)*2880-1]如果读入了点u,时间为t而且它是作为到达时间,那么 阅读全文
posted @ 2013-04-02 19:54 Titanium 阅读(349) 评论(0) 推荐(0)
摘要:求解无向图的点连通度,转化为网络流详细的解释明天再写了#include <cstdio>#include <cstring>#include <queue>using namespace std;#define N 60#define min(a,b) a<b?a:b#define max(a,b) a>b?a:b#define INF 0x3f3f3f3fint first[10*N];struct edge{ int u,v,cap,flow,next;}e[N*N*N];int nume;int n,m;void EK(int s ,int 阅读全文
posted @ 2013-03-31 00:23 Titanium 阅读(260) 评论(0) 推荐(0)
摘要:最大流最小割分析都在代码注释中/*题意:对于一个有向图的最大流,在每条流路中,只能修改一条边,使得修改后,整个网络的最大流可以增大,问有多少条这样的边注意一点,在一条流路中只能修改一条,好像s->1->2->t,假设每条边的容量都是2,那么最大流的流路只有一条,但是这条流路中,要想增大一条边的容量而使整个网络的最大流增加是不行的,一定要把所有边容量都增大,这与题意不符,所以这个case输出是0,表示1条都没有首先我们运行一次最大流,得到最终的残余网络,那么我们怎么找到我们要的割边呢?首先割边一定已经是满流的了,假设我们得到一条满流的边u->v如果源点s可以到达点u,且点 阅读全文
posted @ 2013-03-15 23:53 Titanium 阅读(384) 评论(0) 推荐(0)
摘要:最大流 OR 二分图匹配题意:输入n,有n个插座,下面n行是每个插座的类型(最后24个字母来表示一个插座,没有空格放心用scanf,但是有可能插座会相同,但是这个没有什么影响) 输入m,有m个电器,下面m行每行两个单词分别是电器的名字和插头类型(同样24个字母单词内没空格,两个单词空格隔开) 输入k,有k个转换器,下面k行每行两个单词,分别表示转换器的入口类型和插头类型每种转换器的个数是无限的,转换器本身可以与转换器相连要你求,让最多的电器能够插在插座上(可以用转换器辅助也可以直接插上去),输入不能插上去的电器的数量思路一:转化为最大流,重点还是如何建图,我是用邻接表建图的这样效率... 阅读全文
posted @ 2012-12-21 23:55 Titanium 阅读(1084) 评论(0) 推荐(0)
摘要:网络流最大流(经典的逃脱问题但是不会做啊)这题不会做,问了别人的思路,知道是最大流,但是还是不会编码,后来找了解题报告,看了建图部分明白了,然后就是最大流EK算法模板即可算法思路:对于给定的网格,行为S列为A,我们按行优先给所有点标号,从1到S*A。然后对每个点拆点,拆点后一个点变为两个点(那么总点数为2*S*A),在这里我把拆点后的两个点叫做“前点”和“后点”,对于坐标为(i,j)的点,拆点后“前点”的编号为u=(i-1)*A+j , “后点”的编号好v=u+S*A;我们还要额外设置一个源点s,编号为0,一个汇点,编号为2*S*A+1。从源点s建有向边指向所有的银行,从所有网格边沿的点建有向 阅读全文
posted @ 2012-12-20 22:08 Titanium 阅读(918) 评论(4) 推荐(1)
摘要:最大流水题题意:给n个点从1到n标号,每个点有一个限制值a[i],表示从这个点流出的流量的最大值,就算有超过a[i]的流量流进i点,最后也只有a[i]流量从i点流出。然后每条有向边也有容量cap[u][v]然后给你一个源点0,它会和一些顶点相连,这些边的容量是无穷大的,然后给你一个汇点n+1,也会和一些顶点相连,这些边的容量也是无穷大的,然后求源点到汇点的最大流想了一下,有思路,无非是处理一下边的容量,起初想是对于有向边 u---->v cap[u][v]=min( cap[u][v] , a[u]); 处理完就直接最大流模板上去,过了sample,提交WA,后来才想到是cap[u][v 阅读全文
posted @ 2012-11-30 22:50 Titanium 阅读(544) 评论(1) 推荐(0)
摘要:最大流裸题,有向图,然后又重边,容量要累加,这里是用BFS来做的#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 20queue<int>q;int f[N][N],c[N][N],a[N],p[N],flow;int n,m;//源点和汇点分别规定为1,nvoid BFS(){ flow=0; while(1) { memset(a,0,sizeof(a)); a[1]=INF; ... 阅读全文
posted @ 2012-11-22 23:10 Titanium 阅读(205) 评论(0) 推荐(0)
摘要:最大流裸题,不过要注意建图,有重边,容量要累加,然后是无向图,就当做是有两条方向相反的有向边处理即可,详细看读取数据建图部分然后就是按照白书上面的最大流模板(BFS)来做#include <cstdio>#include <cstring>#include <queue>using namespace std;#define INF 0x3f3f3f3f#define N 110int f[N][N],c[N][N],a[N],p[N];//a数组是一个递推数组,p相当于记录路径int n,m,s,t,flow;queue <int> q;voi 阅读全文
posted @ 2012-11-22 22:25 Titanium 阅读(819) 评论(0) 推荐(0)