![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
图论————网络流
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
1423B - Valuable Paper 二分+最大流
在刷完24道网络流后,这种题随便切。。读题到AC不到25min但还是忘了输出-1wa了一次,还是要细心一点。。显然,二分图,这里的费用是取max,所以用二分建边跑最大流即可。若费用求和,则可用最小费用流。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1000000+7;const int N = 20000+7;struct Dinic{ //N个点,M条原创 2020-11-06 21:31:38 · 170 阅读 · 0 评论 -
(完结撒花)网络流二十三题 ————(二十三)、P3357 最长k可重线段集问题 费用流并联串联问题
先说下为啥完结撒花。。刷完感觉网络流无敌了!!!https://blog.csdn.net/bjfu170203101/article/details/109062331这道题的升级版,懒得再说一遍了。不过这题有几个要注意的点:1:坐标距离会爆longlong;2:1 1 2 2 这种 (x1+1==x2)的线段对结果没有影响,即:这些线段可以随便取,先把这些线段取完扔掉。3:1 1 1 2 这种与x轴垂直的线段是与x=1相交的,要注意处理这种情况:比较好的处理方法是:.原创 2020-10-14 17:43:16 · 118 阅读 · 0 评论 -
网络流二十四题 ————(二十二)、P3356 火星探险问题 费用流经典建模
每个点访问第一次才有贡献,对于点的限制,我们一般把点拆成出点和入点,入边连向入点,出点连向出边。入点连向出点限制点选的次数。我们从入点向出点连一条流量1,花费1的边表示第一次访问该点可以采集一个石头,再连一条流量inf,花费0的边,表示后面可以再次访问该点,但是不会获得石头。S连起点,终点连汇点。跑最大费用流即可。细节较多仔细检查。#include<bits/stdc++.h> using namespace std;typedef long long ll;const原创 2020-10-14 16:04:56 · 129 阅读 · 0 评论 -
网络流二十四题 ————(二十)、P4012 深海机器人问题 费用流经典建模
20分钟AC,这速度还可以。做了20道网络流题目后,基础建模已经没啥问题了。#include<bits/stdc++.h> using namespace std;typedef long long ll;const int N=1000005;const int M=1000005;const ll inf=0x7fffffff;struct MCMF{ struct EDGE { int nxt, to, cost, flow; }ee[M <<.原创 2020-10-14 12:15:23 · 91 阅读 · 0 评论 -
网络流二十四题 ————(十九)、P4013 数字梯形问题 费用流经典建模
比较简单的费用流建模,但还是写了1h,只能说不够熟练。说一下我做题时的想法吧:首先肯定先考虑无任何限制的规则3:无限制的话,只需要考虑第一层最为起点,每个点只能用一次这个限制即可:直接按要求连边建图(流量均为inf,花费为:-权值),然后S连向第一层流量为1,花费为0,这里控制第一层每个点只能取一次表示这个点开始的一条路径。最后一层连向终点,流量inf,花费0.然后仔细分析一下题目,发现:每层连向下一层连边本来就是边不相交的(任意情况我们都可以让左边的路径选择最左边的边,构造出边不.原创 2020-10-14 11:41:38 · 143 阅读 · 0 评论 -
网络流二十四题 ————(二十一)、P3358 最长k可重区间集问题 费用流并联与串联选择
https://www.luogu.com.cn/problem/solution/P3358洛谷大佬们题解写的很棒,我就不献丑了。说下我的理解吧,可以把这个限制过程当初物理中的电路并联与串联。流量就是电流。我们让源点产生k电流。这样保证流经每个点的电流不超过k。每个区间我们给他变成左开右闭区间。仔细体会下这个过程,很有意思的!#include<bits/stdc++.h> using namespace std;typedef long long ll;co原创 2020-10-13 22:33:01 · 156 阅读 · 0 评论 -
网络流二十四题 ————(十八)、P2770 航空路线问题 最大费用流+打印路径
上图时建边详解。打印路径就是,反向边有流时就打印即可。细节见代码。#include<bits/stdc++.h> using namespace std;typedef long long ll;const int MAXN = 5001;const int MAXM = 50001;struct MCMF{ int n, s, t, cnt = 1; long long maxflow=0, mincost=0; int dis[MAXN], head...原创 2020-10-12 16:56:13 · 222 阅读 · 0 评论 -
网络流二十四题 ————(十七)、P3355 骑士共存问题 二分图最小割,转化为网络流最小割 -> 最大流求解
经典套路了,看到这种限制条件比较少的情况,我们很容易想到用最小割的思想。先把所有点都放上骑士,然后横纵坐标为奇数的点在左部图,横纵坐标为偶数的点在右部图(二分图经典套路)。相互不可同时出现一定不在同一部图(因为横纵坐标差3),然后从左部图往其可达点连边,容量为inf。然后起点S连向左部图每个点,容量为1. 右部图每个点连向终点,容量为1.这样求最小割后,S一定不能通过中间达到右边。(中间容量为inf一定不会被割掉)。留下来的每条边都代表一个点放骑士,且是最大数量可放置的骑士。最小割.原创 2020-10-12 12:04:49 · 115 阅读 · 0 评论 -
网络流二十四题 ————(十六)、P2754 [CTSC1999]家园 / 星际转移问题 残留网络建边,最大流+并查集
#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 2500000+7;const int N = 100000+7;struct Dinic{ //N个点,M条边 //add建双向边,然后D.gao ,最后输出maxflow #define inf 0x3f3f3f3f ll maxflow;int s,t,n; int v[N],pre[N],d[N],...原创 2020-10-11 22:28:56 · 100 阅读 · 0 评论 -
网络流二十四题 ————(十五)、P1251 餐巾计划问题 dinic+spfa 跑费用流 飞快
突然发现费用流可以用dinic写,虽然快不了太多,但能快一点是一点。比如这题是用时最短的。这题本身很简单:左部图点表示每天剩的衣服,右部图表示每天要用的衣服。源点连向每个点,容量为r[i],花费0,容量表示每天剩的脏衣服总量。源点连向左部图点p,容量inf,花费0,p连向右部图每个点,容量inf,花费P,表示新买衣服。右部图每个点相连汇点t,容量r[i],花费0,表示每天需要r[i]个新衣服左部图每个点i,连向i+N,容量inf,花费S,表示慢洗。左部图每个点i,连向i+M,..原创 2020-10-11 16:16:36 · 120 阅读 · 0 评论 -
网络流二十四题 ————(十四)、P4015 运输问题 费用流
费用流最简单的模型。容量控制选择权重,费用控制选择代价。最小费用最大流,费用加负数就是最大费用最大流。#include<bits/stdc++.h> using namespace std;const int MAXN = 5001;const int MAXM = 50001;struct MCMF{ int n, s, t, cnt = 1; long long maxflow=0, mincost=0; int dis[MAXN], head[MAXN],原创 2020-10-11 10:24:00 · 171 阅读 · 0 评论 -
网络流二十四题 ————(十三)、P2774 方格取数问题 二分图网络流 最小割模型
一看到网格图我们就要想到:横纵坐标相加为偶数与为奇数的点不相邻这个tips而题目说每个数不与其上下左右共四个数相连,与其他边相连即 —> 考虑删边可能更好做。于是自然而然想到建立网络流最小割模型,删除权值最小的边,使得剩下的点不直接相连。连边如下:左部图为横纵坐标和是奇数的点,右部图是横纵坐标是偶数的点。左部图向其四周不能连边的点连一条容量为无穷大的边。S向左部图每个点连边,容量为点权。右部图每个点向T连边,容量为点权。求这个网络的最小割。我们构造的这个网络S ..原创 2020-10-10 22:27:28 · 136 阅读 · 0 评论 -
网络流二十四题 ————(十二)、P4014 分配问题 二分图带权匹配 网络流解法
做了10多道网络流,没看题解和思路,自己就建立出了二分图带权匹配的费用流模型。感觉已经算是入门了!!如下建边:左部图n个点表示工人,右部图n个点表示工作S连向左部图每个点,流量为1,费用为0.右部图每个点连向T,流量为1,费用为0。这里连向S,T的边流量为1的目的是为了让每个工人做一个工作,每个工作只能一个工人做!然后工人i连向工作j,流量为1,费用为a[i][j],这样跑最小费用最大流,求出的是最小的工作效率,即二分图最小带权匹配。显然费用直接设为负数,就是二分图的最大带权匹配原创 2020-10-10 19:27:51 · 232 阅读 · 0 评论 -
网络流二十四题 ————(十一)、P4009 汽车加油行驶问题 分层图最短路 && 最小费用最大流
这是一道比较经典的最短路,分层图+最短路。。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)//#define m (l+r)/2#define pb push_backtypedef pair<int,int> pii;const double原创 2020-10-10 18:57:22 · 166 阅读 · 0 评论 -
网络流二十四题 ————(八)、P4016 负载平衡问题 最小费用最大流 spfa+dij两种版本写法对比
建模比较简单:求出平均数tp。让S连向 a[i]>tp的节点表示这些仓库需要货物送出,让a[i]<tp的节点连向T表示这些仓库需要货物送入。容量为差值,花费为0然后相邻点连边,容量为inf,花费为1,表示相邻两点可以传送货物。一下是最小费用最大流的两种写法对比:当图是稀疏图时,spfa有很高的效率,而稠密图spfa很容易被卡掉。视情况选择就行。dij版本#include<bits/stdc++.h> using namespace std;const原创 2020-10-09 15:17:20 · 141 阅读 · 0 评论 -
网络流二十四题 ————(七)、P2763 试题库问题 二分图多重匹配, dinic跑+路径输出。 有个小坑
很经典的模型了,之前博客讲的很详细了。现在说下这题wa5的坑:输出方案时容量为0的边可能是从起点连过来的边的反向边!!#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1000000+7;const int N = 1100+7;struct Dinic{ //N个点,M条边 //add建双向边,然后D.gao ,最后输出maxflow #define原创 2020-10-09 11:10:01 · 131 阅读 · 0 评论 -
网络流二十四题 ————( 六)、 P2766 最长不下降子序列问题 最多不相交路径 动态规划+思维建边
第一问入门题:dp[i]表示:以i结尾的LIS。后面要用到这个dp思想:为了让选择的每条IS长度等于mx_dp[i],我们可以这样建模:以所有dp[i]==1为非递减序列的起点,源点连向这些点S,边权为1.以所有dp[i]==mx为非递减序列的终点,这些点连向汇点T,边权为1.所有i,j满足:a[i] <= a[j] && i < j && dp[i]+1 == dp[j] , 从i 向j连边,边权为1。以上方法建模刚好满足从S到T的每一条原创 2020-10-08 23:32:56 · 126 阅读 · 0 评论 -
网络流二十四题 ————( 五)、P3254 圆桌问题 最大流经典模型
最大流经典模型。一个超级源点,连接每个公司,边权为公司人数。一个超级汇点,连接每个桌子,边权为桌子人数。桌子与公司之间连完全图,边权均为1.整个图为二分图加一个源点和一个汇点。所以dinic复杂度最坏为msqrt(n)。跑的飞快。。。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 250000+7;const int N = 500+7;struct Di原创 2020-10-08 21:06:28 · 151 阅读 · 0 评论 -
网络流二十四题 ————( 四)、P2765 魔术球问题 最小路径覆盖模型 +打表找规律 或者 残留网络上跑最大流
最小路径覆盖模型,模型解法见 我上一篇BLOG:https://blog.csdn.net/bjfu170203101/article/details/108956695这题难点在于不知道点数,即不知道改用多少小球,枚举的话,每次重新跑dinic显然会T.我们有两种方法解决这道题:方法一:打表找规律,找出每个n对应的小球的个数,只跑一遍dinic就行。网络流的最坏复杂度是n^2*m , 但实际跑随机数据时(非完全图,边和点同一数量级),效率很高,我们可以把它看成线性的复杂度。。原创 2020-10-08 11:37:57 · 120 阅读 · 0 评论 -
网络流二十四题 ————( 三) 、P2764 最小路径覆盖问题 转化为二分图最大匹配用 网络流求解
设一个有向无环图G =(V,E),n=|V|。把G中的每个点x拆成编号为x和x+n的两个点。建立一张新的二分图,1-n做为二分图的左部点,n+1 -> 2n 做为二分图的右部点,对于原图的每条有向边(x,y),在二分图中的左部点x与右部点y+n之间连边。最终得到的二分图称为G的拆点二分图,记为G2。定理:有向无环图G的最小路径点覆盖包含的路径条数,等于n减去拆点二分图G2的最大匹配数。证明:详细证明在算法竞赛——进阶指南这本书上。我简单说下:最大匹配的每条边对应G中的.原创 2020-10-07 22:25:37 · 176 阅读 · 0 评论 -
网络流二十四题 ————( 二) 、P2762 太空飞行计划问题 最大权闭合图 -> 最小割+打印方案
https://blog.csdn.net/bjfu170203101/article/details/108955233解法总结见我上一篇BLOG。这里只讲一下关于最小割打印。首先最大流只是值等于最小割,最大流选的边不一定等于最小割的边。割是把网络分断的一个边集。我们只需要在残留网络中S开始遍历,可达的点计为标记点(即d[i]>0的点)若一条边 x,y满足:d[x]>0,d[y]==0 则该边属于最小割边集。另外:其实这个模型也可以感性理解一下:最小割一定.原创 2020-10-07 21:18:28 · 154 阅读 · 0 评论 -
hihocoder #1398 : 网络流五·最大权闭合子图 最大权闭合子图问题 转化为最小割 用最大流求解
自己整理了下hiho上的提示。做了下笔记,并用图例解释了提示中难懂的部分!这种题目自己想很难想出来的,不过见一次,下次这种模型就简单了!!#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 50000+7;const int N = 400+7;struct Dinic{ //N个点,M条边 //add建双向边,然后D.gao ,最后输出maxfl.原创 2020-10-07 20:35:56 · 116 阅读 · 0 评论 -
网络流二十四题 ————( 一) 、 P2756 飞行员配对方案问题 二分图最大匹配+打印匹配
建一个超级源点s,超级汇点t。s连向二分图中左部图的每个节点,边权为1.二分图中右部图的每个节点连向t,边权为1.左右部图连边的边权为1。注意上述建边不要忘了建反向权值为0的边,方便撤销影响。然后跑dinic即可。 dinic跑二分图的复杂度为m*sqrt(n)最后要打印匹配。考虑dinic的过程,最后的网络,每条边的反向边有流量(或者正向边无流量),就说明这条边被选中了,输出即可。最后说一下:其实网络流就是找s-t的路径数,每条边的边权就可以看成x -> y 的路径.原创 2020-10-07 16:59:50 · 145 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场)I Interval 最小割模型 + 转化为对偶图nlogn处理最小割
https://blog.csdn.net/MaxMercer/article/details/77976666?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.channel_param不会对偶图的可以学习这位博主原创 2020-09-07 11:13:09 · 179 阅读 · 0 评论 -
2020牛客暑期多校训练营(第一场) H Minimum-cost Flow
这题思路还是比较简单的。因为整个图的每条边的容量都相同设为x。所以在跑费用流的时候,每次的增广路流量一定是容量x。目标是总流量等于1,每次流量+x。只需要满流 [1/x] (下取整)次,再加上最后一次跑一个流量为1-x*[1/x](下取整) 的增广路即可。所花费为: [1/x] (下取整)*(每次的最小花费)+最后一次的最小花费。具体实现看代码主函数部分。#include<bits/stdc++.h> using namespace std;typedef lo原创 2020-07-12 22:52:09 · 350 阅读 · 0 评论 -
P3381 【模板】最小费用最大流
时间复杂度为O(N*E*k),其中K为最大流值。但时间上的期望时间复杂度为:O(A*E*K),其中A为所有顶点进队列的平均次数,可以证明A一般小于等于2。玄学复杂度。。把EK求最大流的bfs改成spfa 就能求zui'xiao#include<bits/stdc++.h> using namespace std;const int MAXN = 5001;const int MAXM = 50001;int n, m, s, t, cnt = 1;int maxflow,原创 2020-07-12 21:51:17 · 388 阅读 · 0 评论 -
网络流——最大流 HLPP 算法模板 P3376 【模板】网络最大流 很快的一种方法
当板子存下来(算法还没研究),复杂度O(n^2 sqrt(m))..快到离谱。。// 500ms 秒掉洛谷推流问题#include <algorithm>#include <iostream>#include <cstring>#include <vector>#include <queue>using namespace std;typedef long long LL;typedef long long F_type;c原创 2020-07-12 21:12:23 · 331 阅读 · 1 评论 -
网络流——最大流 dinic 算法模板 P3376 【模板】网络最大流
dinic复杂度最坏为O(n^2 * m)先构造分层图。然后一次性找出多条增广路更新。重复上述步骤即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 5000+7;const int N = 200+7;int head[N],cnt=1;void init(){cnt=1,memset(head,0,sizeof(head));}struct EDGE原创 2020-07-12 20:44:37 · 218 阅读 · 0 评论 -
网络流——最大流 EK算法模板 P3376 【模板】网络最大流
复杂度最坏:O(n*m^2) 因为最多会找n*m次增广路#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 5000+7;const int N = 200+7;int head[N],cnt=1;void init(){cnt=1,memset(head,0,sizeof(head));}struct EDGE{int to,nxt;ll w;}ee[M*2];vo.原创 2020-07-12 20:18:10 · 134 阅读 · 0 评论