网络流

poj 3614(网络流)

十年热恋 提交于 2020-01-13 12:05:40
Sunscreen Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6672 Accepted: 2348 Description To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they're at the beach. Cow i has a minimum and maximum SPF rating (1 ≤ minSPF i ≤ 1,000; minSPF i ≤ maxSPF i ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn't tan at all........ The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPF i (1 ≤ SPF i

[网络流24题] 2. 太空飞行计划问题 解题报告

那年仲夏 提交于 2020-01-13 09:09:39
太空飞行计划问题 题意 有 \(m\) 组实验, \(n\) 个器材, 每个实验需要若干个器材, 可以获得一定收益, 每个器材有一定的费用, 求最大净收益 (总收益 - 总费用), 并输出方案. 思路 将每个器材连向 \(S\) , 边权为器材的费用, 将每个实验连向 \(T\) , 边权为实验的收益, 每个器材向需要它的实验连边, 边权为 \(inf\) , 跑最小割就行了. 需要注意的是, 最后输出方案, 判断每个器材是否被选中时, 不能单纯地判断 \(S\) 连向它的边权是否为 \(0\) , 因为就算边权为 \(0\) , \(S\) 还是能够通过其他路径增广它, 所以应该判断 \(Dinic\) 算法最后一次 \(bfs\) 时有没有经过它, 如果没有经过, 就表示它被选中了. 代码 #include<bits/stdc++.h> #define pb push_back #define sz size using namespace std; const int _=100+7; const int __=20400+7; const int inf=0x3f3f3f3f; int n,m,S,T,d[_],max_flow,ans; int lst[_],nxt[__],to[__],c[__],tot=1; char tools[10000]; queue<int>

网络流

与世无争的帅哥 提交于 2020-01-11 17:26:22
ISAP #include <iostream> #include <algorithm> #include <queue> namespace flow { const int N = 400000 + 7; const int INF = (1 << 30) - 1; struct flow { int n, m, st, ed; int lay[N], gap[N], cur[N], pre[N]; struct edge { int to, nex, cap; } e[N]; int fir[N], eid = 1; void addedge(int u, int v, int c); void addflow(int u, int v, int c); int isap(); }; void flow::addedge(int u, int v, int c) { e[++eid] = (edge){ v, fir[u], c }, fir[u] = eid; } void flow::addflow(int u, int v, int c) { addedge(u, v, c), addedge(v, u, 0); } int flow::isap() { std::queue <int> q; q.push(ed); for (int s; q.size(); ) {

【模板】最大网络流

有些话、适合烂在心里 提交于 2019-12-28 10:04:45
D e s c r i p t i o n Description D e s c r i p t i o n 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。 I n p u t Input I n p u t 第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。 接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi) O u t p u t Output O u t p u t 一行,包含一个正整数,即为该网络的最大流。 S a m p l e I n p u t Sample Input S a m p l e I n p u t 4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 S a m p l e O u t p u t Sample Output S a m p l e O u t p u t 50 H i n t Hint H i n t 对于30%的数据:N<=10,M<=25 对于70%的数据:N<=200,M<=1000 对于100%的数据:N<=10000,M<=100000 样例说明: 题目中存在3条路径: 4–>2–>3,该路线可通过20的流量 4–>3,可通过20的流量 4–>2–>1–>3,可通过10的流量

【网络流】【图论】【模板】网络最大流(luogu P3376)

≡放荡痞女 提交于 2019-12-28 10:04:09
前言 我枯了 题目: 数据: 思路: 先讲一些概念性的定义 名称 定义 原点 只有流出的点 汇点 只有流入的点 流量 一条边流过的量 容量 一条边的最大流量 残量 容量 - 流量 然后在看基本性质 1.对于任意一个“管道”流量 < = <= < = 容量 这个就很显然没什么好说 2.每个点(除原点和汇点)的入流和出流相等,就是原点流出多少就会有多少流入汇点,这个也很显然 3.对于一条有向边(u,v)k[u][v] = -k[v][u] 其实就是 最后来看一下算法 我们只学了dinic和一种慢到炸的算法 显然用dinic,毕竟快 这个算法就是每次以原点bfs求出每个边的编号,表示从原点到i通过至少几条残量大于0的边,再跑dfs找增广路并增广,如果没有增广路,返回步骤一,如果bfs没到汇点证明算法结束 C o d e Code C o d e : # include <queue> # include <cstdio> # include <iostream> # include <cstring> const long long INF = 1 << 29 ; using namespace std ; long long n , m , s , y , t ; long long h [ 100000 ] , dis [ 100000 ] ; long long tt ;

网络流最小路径覆盖

牧云@^-^@ 提交于 2019-12-27 06:04:32
思路: http://blog.csdn.net/tramp_1/article/details/52742572 每个点x拆成两个点x和x',分别表示x作为前驱和作为后继。若原图中x和y有边,向x和y'加一条有向边。如此构成二分图,记此二分图中作为前驱的节点集合为A,作为后继的节点集合为B。跑最大匹配,没有匹配的点的个数(n-最大匹配数)就是需要的最少的路径条数。正确性:二分匹配可以保证每个点顶多只有一个前驱,并且顶多只有一个后继,也就保证了每个点在且仅在一条路径中。此外,在二分图中,A中每个没有匹配的顶点对应了一条路径的终点。(类似地,B中每一个没有匹配的顶点对应了一条路径的起点。)最大二分匹配可以保证A(或B)中没有匹配的点的数量最少,亦即路径条数最少。 实现: 1 #include <bits/stdc++.h> 2 3 #define N (1000 + 2) 4 #define M (N * N + 4 * N) 5 6 typedef long long LL; 7 8 using namespace std; 9 10 struct edge 11 { 12 int v, cap, next; 13 }; 14 edge e[M]; 15 16 int head[N], level[N], cur[N]; 17 int num_of_edges; 18 19 /*

Landscaping Gym - 101128F (网络流)

一世执手 提交于 2019-12-27 04:22:46
Problem F: Landscaping \[ Time Limit: 1 s \quad Memory Limit: 256 MiB \] 题意 题意是给出一个 \(n*m\) 的格子,其中一些是低海拔的,一些是高海拔的,然后有 \(n+m\) 辆推土车从左到右,从上到下推过去,推土车在不同高度的块之前走需要花费 \(A\) 元,也可以花费 \(B\) 元改变一个块的海拔 思路 这个网络流真的好骚啊... 先说建图怎么建图,建图分成三步 从源点到所有低海拔的块建一条 \(B\) 流量的边 从所有高海拔的块到汇点建一条 \(B\) 流量的边 对于所有块,想四个方向建一条 \(A\) 流量的边 考虑其中的一条流量。 源点 \(\frac{B}{——>}\) 低海拔 \(\frac{A}{——>}\) 高海拔 \(\frac{B}{——>}\) 汇点 如果 \(A>B\) ,那么能跑出的最大流是 \(B\) ,也就是花费 \(B\) 元把低海拔变为高海拔或者把高海拔变为低海拔,如果 \(B>A\) ,那么跑出的最大流是 \(A\) ,也就是花费 \(A\) 元从低海拔走到高海拔。 我们发现,这个最大流,一定是这三条边中的最小值。思考他们的意义,如果选择第一条边或第三条边,也就是把低海拔变为高海拔或者高海拔变为低海拔,那么这时候网络流中 \(A\) 被忽略了,也符合实际意义

【巨坑】【网络流】线性规划与网络流24题

落爺英雄遲暮 提交于 2019-12-27 03:33:37
2016.2.21 01 飞行员配对方案问题(习题 8-10)   每一条边连接外籍-国内飞行员,显然是一个二分图,最多出发的飞机数,对应着最多的边匹配。   问题转化为经典的二分图匹配问题,可以用匈牙利或者网络流。   源点和每一个外籍飞行员、每一个国内飞行员和汇点、每个可行的配合之间连接一条容量为1的有向边。   可以派出的最多飞机数就是这个网络的最大流    建图部分代码 1 for(;;){ 2 int a,b,c; 3 a=read();b=read(); 4 if(a==-1&&b==-1) break; 5 insert(a,b,1); 6 } 7 for(int i=1;i<=m;i++) insert(n+1,i,1); 8 for(int i=m+1;i<=n;i++) insert(i,n+2,1);    对于方案。。其实我们可以在增广的时候做标记的,但是反正 比较懒 套个模板嘛~   在时候枚举一下飞行员之间边,如果他的容量被修改为0了。那么这就是一对 一对 1 for(int i=1;i<=m;i++){ 2 for(int j=last[i];j;j=e[j].next){ 3 if(e[j].cap==0&&e[j].to<=n&&e[j].to>=1){ 4 printf("%d %d\n",i,e[j].to); 5 break; 6 } 7 }

线性规划与网络流24题

拈花ヽ惹草 提交于 2019-12-27 03:32:02
诈个尸。 1. 飞行员配对方案问题 二分图匹配。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 const int INF = 1e9; 8 const int maxn = 2e5 + 10; 9 int lv[maxn], it[maxn]; 10 int cnt, h[maxn]; 11 12 struct edge 13 { 14 int to, pre, cap; 15 } e[maxn<<1]; 16 17 void init() 18 { 19 memset(h, -1, sizeof(h)); 20 cnt = 0; 21 } 22 23 void add(int from, int to, int cap) 24 { 25 e[cnt].pre = h[from]; 26 e[cnt].to = to; 27 e[cnt].cap = cap; 28 h[from] = cnt; 29 cnt++; 30 } 31 32 void ad(int from, int to, int cap) 33 { 34 add(from, to, cap); 35

网络流24题

亡梦爱人 提交于 2019-12-27 03:29:40
flag:7月苟完除了某题外的23题。 flag完成了Orz ID是luogu上的 ID NAME SOL 2756 飞行员配对方案问题 二分图匹配 2766 最长不下降子序列问题 简单DP+拆点->最大流 4015 运输问题 费用流 4016 负载平衡问题 我爱数学 4014 分配问题 最小/大费用最大流 1251 餐巾计划问题 最小费用最大流 4013 数字梯形问题 各种费用流 2761 软件补丁问题 最短路 2774 方格取数问题 最小割->最大流 4012 深海机器人问题 最大费用最大流 2764 最小路径覆盖问题 DAG最小路径覆盖->最大流 2770 航空路线问题 最大费用最大流 2754 家园 判断可行 3358 最长k可重区间集 奇妙建图,最大费用最大流 3254 圆桌问题 同试题库问题 3357 最长k可重线段集问题 奇妙建图,最大费用最大流 3356 火星探险问题 最大费用最大流+DFS输出路径 4009 汽车加油行驶问题 分层图最短路 2762 太空飞行计划问题 最大独立集->最大流 2765 魔术球问题 贪心可证 2763 试题库问题 最大匹配->最大流+输出方案 3355 骑士共存问题 最小割->最大流 4011 孤岛营救问题 分层图最短路 2775 机器人路径规划问题 来源: https://www.cnblogs.com/sdfzhsz/p