网络流

洛谷·[网络流24题]飞行员配对方案问题

谁说我不能喝 提交于 2020-02-05 23:56:18
初见安~这里是传送门: 洛谷P2756 飞行员配对方案问题 题解 是个比较明显的 网络最大流 吧。或者说是 二分图匹配求最大匹配数 。 构造二分图,一边是S连向外籍飞行员,一边是英国飞行员连向T,边权都是1,按照题目给的关系连边,边权INF,跑最大流就好。可以理解成每个外籍飞行员都有一个贡献,但是要选一个英国飞行员然后流向T。【那不就是二分图最大匹配。】所以用二分图也可以写的。这里就用网络流了,好写。 那么还有个问题就是要输出方案。简单啊,看每个外籍or英国飞行员向英国or外籍飞行员连的边的边权,正边看是否满流,逆边看是否有流,满足那么这两个配一架飞机。 上代码—— #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #define maxn 500 #define maxm 200005 using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; int read() { int x = 0, f = 1, ch = getchar(); while(!isdigit(ch)) {if(ch == '-') f = -1; ch =

网络流小结

╄→尐↘猪︶ㄣ 提交于 2020-02-05 06:53:10
网络流主要包括: 1、最大流 2、费用流 3、有上下界的网络流 网络流的基本技巧: 1、多个源点和汇点的情况。建立超级源点和超级汇点。 2、顶点有容量限制。拆成两个点,此两点连边,容量为原来的点被限制的容量。 3、最大费用转为最小费用。变负数,最后变回来。 一、最大流 最大流算法的思想是不断地找 S 到 T 的增广路。算法的效率是由找增广路的方法决定的。 Edmond - Karp 算法:用广搜找增广路,时间复杂度 O (n*m*m ) 。思路最简单。 1 const int N=110, INF=0x3f3f3f3f; 2 int Map[N][N],pre[N],n,ans; 3 bool vis[N]; 4 queue<int> que; 5 bool EK_bfs(int s,int e) 6 { 7 int i,k; 8 while(!que.empty()) que.pop(); 9 memset(vis,0,sizeof(vis)); 10 memset(pre,0,sizeof(pre)); 11 que.push(s); 12 vis[s]=1; 13 while(!que.empty()) 14 { 15 k=que.front(); 16 if(e==k) return 1; 17 que.pop(); 18 for(i=1;i<=n;i++) 19 { 20

【网络流24题】 方格取数问题

别来无恙 提交于 2020-02-03 11:52:47
题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。对于给定的方格棋盘,按照取数要求编程找出总和最大的数。 输入格式 第 1 行有 2 个正整数 m 和 n,分别表示棋盘的行数和列数。接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数。 输出格式 程序运行结束时,将取数的最大总和输出 输入输出样例 输入 #1 3 3 1 2 3 3 2 3 2 3 1 输出 #1 11 分析 如果将棋盘黑白染色,黑点放左边,白点放右边,每个黑点向相邻的白点连边,会形成一个二分图。 然后每个点都有点权,我们要选择一些点,这些点之间没有边,使得点权最大。 这是二分图的最大独立集问题,就是选出一些点集,每条边至多选择一个点,使得点权和最大。 和它对立的是二分图的最小覆盖集问题,就是选出一些点集,每条边至少选一个点,使得点权和最小。 显然 最大独立集 = V - 最小覆盖集 我们试着求最小覆盖集问题。 建一个超级源点 s s s 和超级汇点 t t t ,从 s s s 到黑点连边,容量为权值, 白点到 t t t 连边,容量为权值,黑点到白点连容量为 i n f inf i n f 的边,求最小割,即是最小覆盖集。如图。 为什么最小割就是答案? 由于中间的边是 i n f

网络流学习笔记

随声附和 提交于 2020-02-02 00:37:36
最大流 ​ 我再次博客上暂不叙述预留推进(SAP), 事实是,我不会 ,暂且搁置,以后会补充 ​ 最大流在实际问题中的应用是,你要从一个源点s送水至汇点t,这些点中有水管链接,水管的最大能通过的水有不同,让你求单位时间内你最多能送多少水。 ​ 我们的流网络可以理解为一群有向边图 ​ 一些想法 ​ 我们定义 \(f(u,v)\) 为u节点到v节点的流量。, \(c(u,v)\) 为u节点到v节点的流量限制 ​ 首先我们由于不能爆水管,有这个显而易见的式子 \[ 0 \le f(u,v) \le c(u,v) \] ​ 其次我们来,思考一下对于每个节点的的流出和流入,显然的我们可以把KCL(即Kirchhoff's Current Law),推广到oi界上,我们有 \[ \sum _{v\in V} f(v,u)=\sum_{v \in V} f(u,v) \] ​ 想法结束进入正题 ​ 经过度娘的帮助,我们知道一种叫做增广路的东西,在一个残余网络(就是说某些管子已经有水了),就是说从源节点到汇节点的一条能走水的路径 ​ 这样我们知道,假如,我们一遍又一遍的操作之后,没有增广路可以找了,那么我们必定求出了最大流 ​ 然而怎么寻找增广路,这是一个问题。 ​ 经过思考之后我们可以用一个十分暴力的思想来解决,进行深搜,主要思想是 我们可以每一次从原点开始深搜 搜到汇节点

BZOJ 3130: [Sdoi2013]费用流

北慕城南 提交于 2020-01-31 07:05:44
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识。 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量。一个合法的网络流方案必须满足:(1)每条边的实际流量都不超过其最大流量且非负;(2)除了源点S和汇点T之外,对于其余所有点,都满足该点总流入流量等于该点总流出流量;而S点的净流出流量等于T点的净流入流量,这个值也即该网络流方案的总运输量。最大流问题就是对于给定的运输网络,求总运输量最大的网络流方案。 上图表示了一个最大流问题。对于每条边,右边的数代表该边的最大流量,左边的数代表在最优解中,该边的实际流量。需要注意到,一个最大流问题的解可能不是唯一的。 对于一张给定的运输网络,Alice先确定一个最大流,如果有多种解,Alice可以任选一种;之后Bob在每条边上分配单位花费(单位花费必须是非负实数),要求所有边的单位花费之和等于P。总费用等于每一条边的实际流量乘以该边的单位花费。需要注意到,Bob在分配单位花费之前,已经知道Alice所给出的最大流方案。现茌Alice希望总费用尽量小,而Bob希望总费用尽量大。我们想知道,如果两个人都执行最优策略,最大流的值和总费用分别为多少。 Input 第一行三个整数N,M,P。N表示给定运输网络中节点的数量,M表示有向边的数量,P的含义见问题描述部分。为了简化问题

网络流模板

耗尽温柔 提交于 2020-01-30 12:18:48
转自 https://www.cnblogs.com/rmy020718/p/9546071.html int deep[N+1]; int q[N+1]= {0},h,t; int cur[N+1]; bool bfs(int S,int T) { for (int i=0; i<=n; i++) deep[i]=0; //初始化深度为0 h=t=1; q[1]=S; deep[S]=1; while (h<=t) { for (int i=lin[q[h]]; i; i=e[i].next) if (!deep[e[i].y]&&e[i].v) //若未计算过深度且这条边不能是空的 { q[++t]=e[i].y; //入队一个节点 deep[q[t]]=deep[q[h]]+1; //计算深度 } ++h; } if (deep[T]) return true; else return false; } int dfs(int start,int T,int minf) { if (start==T) return minf; //若到了汇点直接返回前面流过来的流量 int sum=0,flow=0; for (int &i=cur[start]; i; i=e[i].next) //当前弧优化,运用指针在修改i的同时,将cur[start]顺便修改 if (e[i].v&

kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory

那年仲夏 提交于 2020-01-28 20:28:35
题目链接: https://vjudge.net/problem/POJ-3436 Sample input 1 3 4 15 0 0 0 0 1 0 10 0 0 0 0 1 1 30 0 1 2 1 1 1 3 0 2 1 1 1 1 题目:P —— 一台电脑由p个零件组成    N —— 工厂有n台加工组装电脑的机器   Q ——— i-th机器每单位时间能工作的数量  当每个未成品需要放入某个机器进一步加工的时候,它需要满足这台机器能正常工作的前提,即它必须满足某些零件已经组装好了。样例1: 前p个数字表示,进入i-th台机器,必须满足这些条件(0表示这个零件不能被安装 1表示这个零件必须被安装 2表示这个零件有无被安装无影响) 后p个数字表示,某个未成品被i-th台机器加工完成后,满足了这些条件(0表示这个零件没被安装 1表示这个零件被安装了)问:怎么安排机器工作方案,能使得工作效率最大化,安排情况有很多,输出一种即可。思路:比较清楚,一个超级源点,一个超级汇点,一台机器需要拆成入点和出点,一台机器的入点和出点流量为该机器单位时间的工作量,其他点与点之间的流量就是INF了。重点就是哪些边能建立起来比较麻烦,图建好了,跑一个Dinic就OK了。 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm>

有上下界的网络流问题

不羁岁月 提交于 2020-01-26 20:53:16
有上下界的网络流问题分为无源汇和有源汇两种。 根据周源的《 一种简易的方法求解流量有上下界的网络中网络流问题》 无源汇上下界网络流 的做法是: 设边u->v的下界是B(u,v),上界是C(u,v)。 设M(i)为对于i结点的流入i的下界总和-流出i的下界总和。 增设源点s和汇点t。 如果M(i)>=0 连边s->i,容量为M(i)。 如果M(i)<0 连边i->t,容量为-M(i)。 对于图中的原来的边u-v,连边u->v,容量为C(u,v)-B(u,v)。 然后求最大流。如果对于源点出发的所有边都满流,则说明存在一个可行流满足条件。 有源汇有上下界网络流 的具体做法是: 1.求可行流 从汇点到源点连一条边,容量为INF,其他与无源汇有上下界网络流的建图方法相同。然后以超级源点和超级汇点为网络流的源和汇求一次最大流。 判断起始于超级源点的边是否全部满流即可。 2.求最大流 从汇点到源点连一条边,容量为INF,其他与无源汇有上下界网络流的建图方法相同。然后以超级源点和超级汇点为网络流的源和汇求一次最大流。 判断起始于超级源点的边是否全部满流,若满流,说明存在可行流。 然后去掉汇点到源点连的边,在原来的基础上以原图中的源点和汇点为网络流的源和汇再求一次最大流即可。 ZOJ 2314 Reactor Cooling 无源汇有上下界求最大流 题目链接: http://acm.zju.edu

[上下界网络流]【学习笔记】

故事扮演 提交于 2020-01-25 22:32:31
上下界网络流 前言 我花了几乎一个白天的时间来想为什么有源汇最大流求出的保证是原图的最大流...现在已经不想提这个东西了...简单记一下吧,乱七八糟的思考过程略去了 上下界网络流概述 网络流:满足容量限制和流量平衡 上下界网络流:同时有流量上界和流量下界 \[ \forall i \in V-\{s,t\},\ \sum_{(u,i)\in E}f(u,i) = \sum_{(i,v)\in E}f(i,v) \\ B(u,v) \le f(u,v) \le C(u,v) \\ \] 必须流:B 自由流:C-B 无源汇可行流 没有源点和汇点,要求每个点流量平衡 直接令 \(f(u,v)=B(u,v)+g(u,v)\rightarrow g(u,v) \le C(u,v)-B(u,v)\) 这时候在附加网络中求出的可行流g 不满足原网络流量平衡的限制 ,因为每条边下界不同 通过引入附加源汇ss,tt来补充流量 令 \(extra(i)=\sum_{(u,i)\in E}B(u,i) - \sum_{(i,v)\in E}B(i,v)\) 即 流入下界-流出下界 extra(i)>0, 需要额外流入流量; extra(i)<0, 需要额外流出流量. 分别让附加源和附加汇连边,然后求ss到tt的最大流,如果从ss出的所有边满流那么有解,求出的就是原图的一个可行流 这时候原图中每条边的流量

网络流学习笔记

瘦欲@ 提交于 2020-01-25 16:49:10
网络流学习笔记 简介网络流 网络流应该是NOIP考纲范围内一个比较难的知识点,其实用心学习还是觉得比较简单。 这里用最通俗的语言讲一讲我认识中的网络流,显然是一个初步的概念。 解决网络流问题总是变成这样一个模型: 想象你现在面前有一个城市的排水系统,是由一个个单向联通的管道组成的,其中有一个节点S可以源源不断的流出水,另一个节点T可以源源不断的吸收水, 除此之外其他节点只能流入和流出水,不能排入或者排出水,而管道的粗细是一定的,每根管道在同一时间只能流入一个上限的流量c,现在让你对这个网络进行分析。 1. 求这个网络的S节点(源点)可以在同一时刻流出水的最大流量 2. 若每个管道有一个输送费用(单位流量的花费),求第1问的若干方案里面,保证最大流量基础上,最小代价是多少 3. 若每个管道有一个输送价值(单位流量的价值),求第1问的若干方案里面,保证最大流量基础上,最大价值是多少 这里我们会用最通熟易懂的语言讲述这三个常规问题的做法。 流量网络的分析(最简单的概念) 引入一个概念 流量网络 ,什么是流量网络,就是给你的原始的流量图只有每条边的限流而具体的最大可行的流量未知 引入一个概念 可行流量 ,我们定义一个函数f(u,v)这个由一个二元组映射到一个值表示一条边(u,v)∈E 的可行流量。 引入一个概念 限流量 ,c(u,v)表示一条边(u,v)∈E,由于一些限制最多能流经的流量