
网络流学习
网络流学习
吃饺子不蘸醋OxO
这个作者很懒,什么都没留下…
展开
-
学习网络流的一些心得
最大流一般都是用dinic算法来求解对于二分问题 我会把所有匹配的左点向右点连一条边 然后建立源点和汇点 从源点向所有左点建立一条边权为1的边 再从所有右点向汇点连一条边 跑一遍dinic求解出最大流即为最大匹配数对与有上下界的网络流问题 我一般都会建立新图 可以参考这篇博客对于关键边问题 我认为应该加强对网络流原理的理解 这种问题常常比较灵活例如在问到在一个流网络中 增大一条边从而使最大流增大 问有多少条这样的边 我们可以在图中遍历所有u->v 找到 f[i] == 0并且从S可以到u以及原创 2021-08-11 15:08:15 · 143 阅读 · 0 评论 -
Acwing 网络流 进阶课题单
Acwing 2171. EK求最大流原创 2021-08-06 00:34:52 · 533 阅读 · 0 评论 -
POJ - 2516 Minimum Cost
思路这个图真的建的太恶心了 题意就读了好长时间 由于点数太多 所以我们考虑将每种货物分别求一次最大流最小费用 然后最后加起来判断最大流是否满足题意部分数据(隔壁博客偷来的555)input1 3 31 1 10 1 11 2 21 0 11 2 31 1 12 1 11 1 132202 4 30 2 32 3 41 0 21 0 30 2 42 3 02 3 1 21 2 3 11 1 2 32 1 3 12 2 3 12 3 4 12 2原创 2021-08-19 18:09:57 · 147 阅读 · 0 评论 -
Acwing 969. 志愿者招募
题目思路这道题是无源汇的有上下界的网络流问题对于志愿者 s t c 来说 可以从t连向s一条容量为INF 花费为c的边 使得由于流量守恒 从s到t要多留的流从t到s的这条边再留回来 实现志愿者在s和t之间做志愿然后用求解无源汇有上下界的可行流问题来求解无源汇最大流最小费用问题代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include原创 2021-08-16 15:55:32 · 143 阅读 · 0 评论 -
Acwing 2194. 负载平衡问题 (最大流 费用流)
#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <queue>using namespace std;const int N = 110, M = 1010, INF = 1e8;int n, S, T;int h[N], e[M], ne[M], f[M], w[M], idx;int d[N], pre[原创 2021-08-14 17:07:02 · 170 阅读 · 0 评论 -
Acwing 2184. 餐巾计划问题
餐巾计划问题思路将一天的毛巾 分为两部分 一部分为旧毛巾 一部分为新毛巾即所需要的毛巾对于新毛巾所被连的边 1-新买的毛巾 2-快洗店送来的毛巾 3-慢洗店送来的毛巾所连的边 到汇点T即完成任务的边对于老毛巾所被连的边 1-一天用完的毛巾 2-前一天剩下的所有旧毛巾所连的边 1-保留到第二天的毛巾 2-送到快洗店的毛巾 3-送到慢洗店的毛巾注意 要用S连向旧毛巾来输送旧毛巾的流 因为当天用完的新毛巾需要连向汇点T去完成任务 如果用新毛巾直接连向旧毛巾来输送旧毛巾的流 会导致当天旧毛巾可能无流原创 2021-08-15 11:49:42 · 134 阅读 · 0 评论 -
Acwing 2195. 深海机器人问题
题意有a个起点 b个终点 每条边都有一个权值 有若干个机器人由起点向终点走 期间只能往上或往右走 同时可以拿掉路径上的边权 但每条边的边权只能拿一次 问最大能拿走的权值之和为多少思路对于每条路径连两条边 一条为(1, c)的 一条为(INF, 0)的 从源点S连边至起点 从终点连边至T 跑一遍最大费用流就可对于这个题的坐标和编程中的坐标方向不同 不用管他 映射出来的结果是一样的代码#include <iostream>#include <algorithm>#incl原创 2021-08-15 10:35:20 · 154 阅读 · 0 评论 -
Acwing 382. K取方格数
题意从左上角到右下角走 每个格子都有一个点权 每次经过都可以拿走但只能拿一次 问走k次所拿走的点权和最大为多少思路dp行不通 因为k太大了 如果是两次的话可以用f[k, x1, x2]来进行dp用最大费用流 每个格子向右向下连边 容量为INF 因为可以多次走由于点权问题 所以拆点 边权为点权重点来了:因为每个格子的值只能拿一次 但是如果通俗建边是无法保证只拿一次的所以我们可以建两条边 一条为容量为1 费用为点权的边以及一条容量为INF 但是费用为0的边 则保证了最多只拿一次这个格子的值跑一原创 2021-08-14 23:38:45 · 155 阅读 · 0 评论 -
Acwing 2191. 数字梯形问题
题意第一行有m个数 从这m个数往下流且满足规则x 问数字总和最大为多少思路首先点权问题毫无疑问要拆点 拆为入点出点 边权为点权若要求路径不能在点处相交时 则将所有入点到出点的容量设为1若要求路径不能在边处相交时 则在连两个不同点时 将边的容量设为1注意 在图论问题中 不在边上相交一般指的是不共边根据规则设置边的容量跑最大费用流即可小tips:用 id[i][j] 来记录的点 然后 id2 和 id2+1 表示入点和出点注意规则2和规则3的时候加汇点方向的边时要将其容量设为无穷大因为同一原创 2021-08-14 19:20:44 · 145 阅读 · 0 评论 -
POJ - 3469 Dual Core CPU
题目大意有n个模块 在双核cpu(A, B)上运行 模块i在a上运行成本为ai 在b上运行成本为bi 有m对模块之间要进行数据交换且有额外成本 但如果两个模块在相同内核上运行则不需要额外成本 问运行所有模块最小成本题目思路可以把A B看作源点和汇点 S向每个模块上连边, 模块向T连边 边权为模块在这个内核上运行的成本 然后再把数据交换的边连上(双向), 边权为额外成本 求最小割 割掉哪个边即为不在哪个内核上运行代码#include <iostream> #include <al原创 2021-08-14 14:41:42 · 155 阅读 · 0 评论 -
HDU - 3491 Thieves (最小割拆点)
题意有一群盗贼从S城到T城作案 警察想办法从中间截击这帮盗贼使得他们无法到达T城 小偷初始都在S点 问警察最少要抓多少盗贼使得他们无法到达T城 即割掉多少点使得图不连通 求最小点权思路拆点 将点拆为入点和出点 出点在右侧 故 S 要加 n 出点入点之间边权为原图点权且为单向边 作图连接不同点之间边的时候边权设为无穷大 使得求最小割不会切掉这些边(原图中的边)代码#include <iostream> #include <algorithm>#include <cs原创 2021-08-14 13:54:10 · 117 阅读 · 0 评论 -
Acwing 381. 有线电视网络 (最小割)
题意给定一张n个点 m条边的无向图 问删最少的点使得这张图不连通题目思路删点问题想到拆点和割边 最小割问题用来求解割边 拆点把一个点变为带边权为1的两个点入点和出点 由于是割点只能割掉拆点得到的这条边权为1的边 不能割掉其他不同两点之间的边 所以将不同点之间的边权设为无穷大 从而保证最小割是割点而不是割边将图变为不连通即将源点和汇点变为不连通 遍历所有点做源点和汇点 每次跑一遍dinic求最小割 更新最小值res (res初值要为n)代码#include <iostream>#in原创 2021-08-13 17:15:37 · 125 阅读 · 0 评论 -
Acwing 2326. 王者之剑
题目链接题目思路由题意可以分析出1、只能在偶数秒时刻才能拿宝石2、相邻位置的宝石不可以兼得3、由2可以想到二分图的最大权独立集故对于整张图分为两部分 由S连向一部分为坐标之和为奇数的点 另一部分为坐标之和为偶数的点连向T 同边各点必不会相邻 再将左边点连向相邻点权值为INF 跑一遍dinic 用所有点之和减去最小割得到答案对于求二分图最大权独立集 可以用所有点权之和减去最小权点覆盖 二分图最小权点覆盖可以用dinic求最小割来求 选择哪个点则割去哪条与此点相连的边代码#include &原创 2021-08-13 13:30:42 · 151 阅读 · 0 评论 -
POJ 2125 Destroying The Graph (最小割的最小权覆盖问题)
题意给定一个有向图 对于每个点可以毁坏相应的所有入边和出边 所有出边和入边都对应着相应的权值即成本 问若要完全毁坏这张图(即将图中的所有边移除) 所花费最小值是多少思路先拆点 将所有点分为出点和入点 将源点连向所有入点 边的权值为删去此点所有入边所花费的值 将所有出点连向汇点 边的权值为删去此点所有出边所花费的权值 再根据题意连两个不同点之间的边 求最小割 即删去哪些边使得S T不连通所花费的最小值求删的方案可以用dfs来求最后所有与S相连的点 并标记 所有与S不相连的点即删去了这个点的所有入边 同原创 2021-08-13 11:33:49 · 128 阅读 · 0 评论 -
Being a Hero (HDU 3251)
题意给定一张图 图中每个点都有相对应的点权 每条边也都有相应的边权 选择一部分边与首都点1断开 求断开后不与首都相连的点减去断开的边的边权的最大值思路将首都作为源点 与各点相连 其中边权为道路的权值 建立一个汇点 与所可选城市建立边 边权为点的点权 用所有点的点权和减去最小割即为答案(若选择某个点 那么结果就要加上它所对应的那条边的权值 若不选择那个点 结果就要加上那个点的点权值 因为它与汇点相连 割掉这条边即为减去点值为此点权值的值)找那些被割掉的边 可以通过最后bfs完的d来判断代码#in原创 2021-08-12 18:26:21 · 162 阅读 · 0 评论 -
有上下界的网络流问题总结
题目描述有上下界的网络流问题总结1.无源汇上下界可行流2.有源汇上下界可行流3.有源汇上下界最大流4.有源汇上下界最小流1.无源汇上下界可行流step1:建立新图G’。新边容量为d-c(上界-下界)s = 0, t = n+1;for (int i = 0; i < m; i ++ ){ int a, b, c, d; cin >> a >> b >> c >> d; add(a, b, c, d);原创 2021-08-08 17:47:53 · 204 阅读 · 0 评论 -
POJ - 3281 Dining 最大流 + 拆点
题意每头牛可搭配一种食物和一种饮料 每种食物只有一份 问最多可以满足多少头牛既有饮料又有实物思路拆点对于每头牛拆为一个入点一个出点 边权为1 从而可以满足同一头牛只使用一次代码#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int N = 1010, M = 100010, INF =原创 2021-08-11 12:41:51 · 134 阅读 · 0 评论 -
POJ - 3436 ACM Computer Factory 最大流问题
题意题目超长 题意超难理解 翻译一下:输入的三项分别为, 每小时加工零件数量, 需要零件, 加工后所包含的零件问把空零件的电脑加工为满零件的电脑 怎样搭配使得生产效率最高即0 0 0 … 0 加工为 1 1 1 … 1思路最大流+拆点问题拆点 每个机器输入指向输出 边权为生产效率先对于所有输入为000的建一条由源点S指向的边再对于所有输出为111的建一条指向T的边再遍历所有机器 如果u的输出和v的输入可以搭配 则连一条u->v的边跑一遍dinic求最大流找边的话可以用st原创 2021-08-11 12:37:32 · 146 阅读 · 0 评论