【网络流/二分图匹配】
张松超
这个作者很懒,什么都没留下…
展开
-
HDU ~ 3416 ~ Marriage Match IV (最短路Dijkstra + 网络流Dinic)
题意:T组测试数据,给你N个点M条单向边,再给你起点A,终点B, 问你A~B的最短路最多有多少条?思路:先求出在最短路上的所有的边,然后以这些边建图,容量均为1,跑A~B的最大流就是答案。正向建边跑一边最短路得到一个以A为源点最短路(dis1),反向建边再跑一次得到一个以B为起点的最短路(dis2),最短路径长度为dis1[B](dis1[B]==dis2[A])。如果对于边权为w的边u~原创 2018-02-03 22:49:03 · 318 阅读 · 0 评论 -
UVA ~ 11613 ~ Acme Corporation (流量不固定的有源汇的最小费用流)
题意 思路本题做法,给每个月建立两个点 i 和 i',在建立源点s和汇点t。①源点s向每个点 i 连一条边,流量为第i个月的产量,花费为生产成本②每个点 i' 到汇点建一条边,流量为第i个月的销量,花费为(负的!)单位售价③每个点 i ,向 i' ,(i'+1),(i'+2),(i'+3)...连一条边,流量为INF,花费为储存月数的花费当s-t的最短路长度大于...原创 2018-09-18 21:50:09 · 218 阅读 · 0 评论 -
POJ ~ 3155 ~ Hard Life (最大密度子图)
上面是,本题需要输出方案数。 题解参见国家集训队2007论文集7.胡伯涛《最小割模型在信息学竞赛中的应用》注意M = 0时,输出1,1还有就是精度的控制,理论精度应该为1/n/n,我把eps设置为1e-7也过了。论文中说的二分要根据 h(g) 和 0 的关系,本题中判断 h(g) 和 0 的关系不行,需要判断 h(g) 和 eps 的关系,不太明白为什么。做法①:...原创 2018-09-23 21:01:34 · 278 阅读 · 0 评论 -
BZOJ ~ 1312 ~ Neerc2006 Hard Life (最大密度子图)
本题同POJ ~ 3155 ~ Hard Life (最大密度子图),POJ需要输出方案,本题不需要。 做法①转化为补集思想,求最小割做法。//#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<algorithm>#include&l...原创 2018-09-24 20:32:23 · 605 阅读 · 0 评论 -
HDU ~ 1569 ~ 方格取数(2) (二分图带权最大独立集 + 奇偶建图)
题解二分图带权最大独立集 = 点权和 - 最小割(最大流)。根据奇偶性建图,首先建立超级源点s和超级汇点t。①如果对于点(x,y),x+y为奇数的话,那么我们把他向周围的四个点(相邻的偶数点)建边② s 向奇数点建边③偶数点向 t 建边这样问题就转化为了一个二分图带权最大独立集问题了。#include<bits/stdc++.h>using name...原创 2018-09-19 16:06:19 · 271 阅读 · 0 评论 -
UVALive ~ 3231 ~ Fair Share (公平分配问题)
训练指南上的例题。二分枚举x即可。#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int from, to, cap, flow; //起点,终点,容量,流量 ...原创 2018-09-19 17:34:05 · 432 阅读 · 0 评论 -
POJ ~ 3680 ~ Intervals (区间k覆盖问题)
图片来自训练指南 //#include<bits/stdc++.h>#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<vector>using n原创 2018-09-19 18:30:38 · 363 阅读 · 0 评论 -
ZOJ ~ 3229 ~ Shoot the Bullet (有源汇上下界最大流)
题意你要给一些小姐姐拍照。第一行输入N,M表示总共要拍N天,共有M个小姐姐。第二行输入M个,每个小姐姐至少要拍G[i]张照片。下面开始输入N天的内容,每一天先输入C,D表示你今天只能拍C个小姐姐,今天最多拍D张照片,然后输入C行,每一行输入T,L,R表示可以今天可以拍T号小姐姐,给这个小姐姐今天最少拍L张最多拍R张。问有没有一种可行的方案,如果有输出拍照最多的方案。 思路有...原创 2018-09-14 19:30:52 · 231 阅读 · 0 评论 -
LiberOJ ~ 115 ~ 无源汇有上下界可行流 (模板题)
//#include<bits/stdc++.h>#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <queue>using namespace s原创 2018-09-14 19:44:38 · 203 阅读 · 0 评论 -
LiberOJ ~ 116 ~ 有源汇有上下界最大流 (模板题)
#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int from, to, cap, flow; //起点,终点,容量,流量 Edge(int u, int v, i...原创 2018-09-14 19:52:26 · 168 阅读 · 0 评论 -
LiberOJ ~ 116 ~ 有源汇有上下界最小流 (模板题)
#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int INF = 0x3f3f3f3f;struct Edge{ int from, to, cap, flow; //起点,终点,容量,流量 Edge(int u, int v, int ...原创 2018-09-14 21:00:43 · 225 阅读 · 0 评论 -
HDU ~ 3667 ~ Transportation (费用与流量平方成正比的最小费用最大流)
题意N个城市,M条边,你要从1点运送k个货物到n点。每条边u,v,a,c表示u->v有一条边容量为c,从这条边运送x个物品花费为a*x*x,问最小花费为多少,如果不能运送k个物品到n点输出-1。 思路费用与流量平方成正比的最小流。图片来自刘汝佳的训练指南: #include<bits/stdc++.h>using namespace st...原创 2018-09-14 21:41:19 · 357 阅读 · 0 评论 -
HDU ~ 5988 ~ Coding Contest (log乘变加 + 费用流)
题意在ICPC比赛现场,有N个点,M条路。每个点有s[i]个人和b[i]个面包,每条路上都有插线板,最多允许通过c[i]个人,每个人通过的时候有p[i]的概率会提到插线板,踢到插线板会使网络故障,但是每条路第一个人通过的时候一定不会踢到插线板。问使得每个人都能吃上面包且网络不发生故障的最大概率。保证有解。思路明显的费用流。最大不故障的概率 = 1 - 最小故障的概率,这样就可以求最...原创 2018-10-08 17:27:07 · 295 阅读 · 0 评论 -
HDU ~ 4685 ~ Prince and Princess (二分图匹配(网络流) + 强连通缩点)
题意T组测试数据,每组先输入n,m表示有n个王子和m个公主,接下来n行,每行先输入k表示,第i个王子有K个喜欢的公主,然后输入这k个公主的编号。每个王子只能和喜欢的妹子结婚,国王要求给他一个表,每个王子可以和几个公主结婚,按序号升序输出妹子的编号。这个表应满足所有的王子最终都有妹子和他结婚,即必须保证王子与这些对象中的任意一个结婚,都不会影响让剩余的王子中突然有一个人没婚可结了。思路其实基本...原创 2018-11-13 12:57:34 · 403 阅读 · 0 评论 -
POJ ~ 3498 ~ March of the Penguins(最大流,结点容量)
题意T组测试数据,每组先输入N,d,表示有N块浮冰。然后输入N行表式N块浮冰的信息编号为0~(N-1),(x[i],y[i],n[i],m[i])表示第 i 块浮冰在(x[i],y[i])位置,上面有n[i]只企鹅,m[i]表示这块浮冰最多允许跳跃m[i]只企鹅从这里离开。每块浮冰都可以承载无穷的企鹅,问哪几块浮冰可以使全部企鹅都可以到达,输出这几块浮冰的编号,否则输出-1.思路其实就是...原创 2018-11-20 18:00:08 · 768 阅读 · 0 评论 -
牛客国庆集训派对Day6 ~ A ~ Birthday (费用与流量平方成正比的最小费用最大流)
思路比较裸的这种题把。把m个区域拆点,每个区域拆成两个点。0表示超级源点,[1,n][1,n][1,n]表示蜡烛,[n+1,n+m][n+1,n+m][n+1,n+m]表示m个区域的左边的点,[n+m+1,n+m+m][n+m+1,n+m+m][n+m+1,n+m+m]表示m个区域的右边的点,n+m+m+1为超级汇点。建边如下:①源点向N个蜡烛建边,容量为1,花费为0②m个区域的右边的点...原创 2018-11-17 20:54:26 · 284 阅读 · 0 评论 -
HDU ~ 2732 ~ Leapin' Lizards(最大流,结点容量)
题意T组测试数据,每组测试数据输入n,d,表示有两个n行的矩阵,保证列数相等但是没有输入是多少列。第一个矩阵,每个点有一根柱子,每个柱子的高度&lt;10。第二个矩阵,‘L’表示该点有一只蜥蜴,‘.’表示啥也没有。由于作用力与反作用力的原因,柱子上每当有一只蜥蜴跳过柱子高度就会减少1,柱子高度为0时不能再有蜥蜴跳过。蜥蜴跳跃距离为d,行数之差+列数之差距离不超过d即可进行跳跃。思路...原创 2018-11-20 14:21:30 · 233 阅读 · 0 评论 -
ACM-ICPC 2018 沈阳赛区网络预赛 F题 Fantastic Graph (有源汇上下界可行流)
题意给你两个集合X,Y,X集合有N个点,Y集合有M个点,输入一个上下界down,up,现在有K条边,输入K条边(u,v)。每选择一条边(u,v),u和v点的权值就+1,问能否通过选择一些边(每条边只能选一次)使得所有点的权值都在[down,up]之间。思路有源汇的上下界可行流。建立源点s,t。①s向X集合每一个点连边,上下界为[down,up]②Y集合向 t 连边, 上下界...原创 2018-09-12 21:59:55 · 231 阅读 · 0 评论 -
POJ ~ 2396 ~ Budget (有源汇上下界可行流)
题意T组测试数据,给你一个n*m的矩阵,输入每一行的和,每一列的和,在输入一些形如x y > z限制条件,如果x为0表示所有行,y为0表示所有列,x==0,y==0表示整个矩阵。求是否村子满足要求的矩阵,存在就输出矩阵。 思路转化为有源汇上下界可行流来做。行列看作点,行为Xi,列为Yi,建立源点s,汇点t。①源点向行Xi建边,上下界均为行和②列Yi向汇点Yi建边,...原创 2018-09-12 20:12:38 · 245 阅读 · 0 评论 -
洛谷 ~ P2604 [ZJOI2010] ~ 网络扩容 (最小费用最大流)
第一问:建边u->v容量为题中容量,花费为0,跑费用流得到的最大流就是答案。第二问:建边u->v容量为INF,花费题中花费,跑费用流得到的费用就是答案。#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int INF = 0x3f3f3f3f;struc...原创 2018-09-16 18:36:40 · 167 阅读 · 0 评论 -
POJ ~ 1273 ~ Drainage Ditches(Dinic和EK模板)
题意:给定 n个点,m条边。下面m行,每行三个数字s,e,c表示s到e的容量为c/秒。问从1-n的每秒钟的最大流量为多少?思路:刘汝佳大神的模板。交POJ的话会CE,大家把万能头换掉就好了。Dinic:#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int IN...原创 2018-01-27 13:18:37 · 400 阅读 · 0 评论 -
POJ ~ 2047 ~ Concert Hall Scheduling (MCMF + 区间K覆盖问题)
题意:一个公司有两个音乐厅,给你N,表示有N个请求,每个请求三个数字a,b,c,表示[a,b]区间给c的收益,a,b表示区间的第一天和最后一天。求能一年中(365天)能获得的最大的收益。思路:典型的区间K覆盖问题。问题:数轴上有一些带权值的左闭右开区间,选出权和尽量大的一些区间,使得任意一个数最多被K个区间覆盖。解:本题可以用最小费用流解决,构图方法是把每个数作为一个结点,然后对于权值为W的区间[...原创 2018-04-14 21:09:00 · 436 阅读 · 0 评论 -
POJ ~ 1459 ~ Power Network (最大流 + 多源多汇问题 + 输入处理)
题意:m个点(0~m-1),a个发电站,b个用户,n条边。先输入n条边,格式为(u,v)w,然后输入a个发电站发送的最大电量(u)w,然后输入b个用户接受的最大电量(v)w。求发电站能输送到用户的最大电量?思路:多源多汇问题。多源多汇问题:源有多个,汇也有多个,流可以从任意一个源流出,最终可以流向任意一个汇,总流量等于所有源流出的总流量,也等于流进所有汇的总流量。解:加一个超级源s'和超级汇t',...原创 2018-04-15 21:38:21 · 890 阅读 · 0 评论 -
POJ ~ 3281 ~ Dining (最大流 + 结点容量问题)
题意:John有N头牛,F种食物,D种饮料,编号均从1开始。然后N行,开始两个整数表示f,d表示第i行表示第i头牛喜欢吃的食物数和饮料数,然后依次输入食物编号和饮料编号,问最多满足多少头牛?结点容量问题:每个结点都有一个允许通过的最大流量,称为结点容量。解:把每个原始点u分裂成u1和u2两个结点,中间连一条有向弧,容量等于u的节点容量。原先到达u的弧改成到达u1;而原先从u出发的弧改成到达u1,而...原创 2018-04-16 17:15:53 · 697 阅读 · 0 评论 -
POJ ~ 3041 ~ Asteroids (二分图 + 最小点覆盖)
题意:输入n,k表示在N*N的图上有k个星星,我们每次可以消除一列或者一行的星星,问最少需要多少次能把所有的星星消完?思路:行看作左边集合的点(1~n),列看作右边集合的点(1+n~2n)。对于每个星星(x,y)建一条x->y+n边,然后求二分图最大匹配数就是答案。点覆盖,在图论中点覆盖的概念定义如下:对于图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中。最小点...原创 2018-04-16 20:35:00 · 256 阅读 · 0 评论 -
POJ ~ 2446 ~ Chessboard (二分图匹配 + 奇偶性建图)
题意:输入三个数字m,n,k。表示m*n的图中有k个洞,然后输入这k个洞的坐标(y,x),y表示列,x表示行。问拿1*2的木块去是否能铺满这个图,木块不允许覆盖,有洞的地方不允许放。 思路:打死我也想不到这是二分图匹配问题。首先图中的点可以分为两部分,(i+j)为偶数的点,(i+j)为奇数的点,铺砖其实就相当于如果选择一个奇数点那么一定要选择一个偶数点。这样这个图就分为了两部分,奇数点集合...原创 2018-04-16 21:26:10 · 297 阅读 · 0 评论 -
洛谷 ~ P2756 ~ 飞行员配对方案问题 (二分图匹配 + 方案输出)
二分图的网络流解法:建立超级源,超级汇,超级源往左边连边,右边往超级汇连边,边权均为1,最大流就是匹配数。所以跑一遍Dinic,然后有流量的边就是匹配边,输出该边的起点和终点即可。#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int INF = 0x3f3f3f3f...原创 2018-08-14 20:31:07 · 282 阅读 · 0 评论 -
洛谷 ~ P2762 ~ 太空飞行计划问题 (最大权闭合图)
讲解证明:最大权闭合图最后一次的层次图中被走过的点即为被选择的实验和仪器。因为最后一次层次图没有找到s到t的边,s所在集合就是选择的仪器和实验,s所在集合中的点一定会被分得层次,所以最后一次的层次图中被分层的点即为被选择的实验和仪器,所以每次BFS记得清空层次图。#include<bits/stdc++.h>using namespace std;const int ...原创 2018-08-15 01:56:24 · 255 阅读 · 0 评论 -
洛谷 ~ P2764 ~ 最小路径覆盖问题 (最小路径覆盖 + 方案输出)
首先,有一个定理:最小路径覆盖数 = 点数 - 最大匹配数我们首先将原图用n条路径覆盖,每条边只经过一个节点(本身)。可以知道每合并两条路径,路径覆盖数就会减少1。现在尽量合并更多的路径(即将两个路径通过一条边首尾相连)。所以拆点做二分图最大匹配即可。路径输出:顺着匹配边走即可,所以我们先找到匹配边,流量为1的边就是匹配边,如果 i 和 j+n之间流量为1,那么记录to[i]=j。...原创 2018-08-21 02:42:59 · 648 阅读 · 0 评论 -
洛谷 ~ P2765 ~ 魔术球问题 (最小路径覆盖)
思路易证球的个数越多需要的柱子数越多(可能相等),是一个单调递增的关系。我们枚举球的个数num,拆点,如果 i+j 为完全平方数,那么 i - j' 建边,建图方式同洛谷 ~ P2764 ~ 最小路径覆盖问题 (最小路径覆盖 + 方案输出),求得最小路径覆盖数就是需要的柱子数,当最小路径覆盖数 > 柱子数时,最小路径覆盖数-1就是答案。如果每枚举一个num,都去初始化,重新建边一...原创 2018-08-23 21:23:47 · 355 阅读 · 0 评论 -
洛谷 ~ P3254 ~ 圆桌问题 (二分图多重匹配 + 方案输出)
二分图多重匹配问题,建图方式如下:①超级源点S往所有X集合的点建边,边权为点权②所有Y集合的点往超级汇点T建边,边权为点权③二分图中原有的边依旧存在,边权为1(如果该边能使用多次,那么边权为使用次数)求得最大流就是最大匹配的值,从X集合往Y集合的所有满流边就是方案安排。 本题中如果最大流等于总人数证明有解。#include<bits/stdc++.h>u...原创 2018-08-24 00:01:56 · 374 阅读 · 0 评论 -
洛谷 ~ P2766 ~ 最长不下降子序列问题 (LIS + 最大流)
第一问直接DP求解得出最长非递减子序列的长度len,f[i]表示以 i 为结尾的最长非递减子序列的长度。第二问和第三问用网络流求解,第二问:①首先每个点只能被选一次,所以拆点,拆的两个点之间连一条边权为1的边。②然后源点和汇点均可能有多个,所以建立超级源点和超级汇点,超级源点往可能的源点(即f[i]=1的点)连一条边权为1的边,可能的汇点往超级汇点(即f[i]=len的点)连一条边权为...原创 2018-09-05 14:39:36 · 743 阅读 · 1 评论 -
ZOJ ~ 2314 ~ Reactor Cooling (无源汇上下界可行流)
题意T组测试数据,有N个点,M个管子,输入M根单向管子的起点u,终点v,流量下届low[i],流量上届c[i],问是否存在满足要求的可行流,存在的话输出每一根管子的流量。思路模板题啦。建模如下:设sum[i]为顶点 i 的流量和,流出记为 - ,流入记为 +新建虚拟源点vs,汇点vt,首先添加边t ~ s并设容量为无穷大(该边可以不建)。对于输入的每条边,建立u - v...原创 2018-09-11 21:49:07 · 161 阅读 · 0 评论 -
洛谷 ~ P1251 ~ 餐巾计划问题 (拆点,最小费用最大流)
最小费用最大流求解:把每天看做点,由于每天的餐巾有两种状态1.早上需要用干净的 2.晚上用完剩下脏的,所以进行拆点Xi(晚) 和 Yi(早),建立超级源点S,超级汇点T。题目中要求每天的餐巾够用,我们把每天早起Yi 往汇点T连一条流量为r[i],花费为0的边,这条边的流量表示早上得到了多少餐巾,满流表示正好够用,那么早上的餐巾变为脏餐巾我们就不能用 Xi -> Yi 连边表示了,怎么办?...原创 2018-09-05 20:12:46 · 185 阅读 · 0 评论 -
洛谷 ~ P2754 ~ [CTSC1999]家园 (枚举 + 分层图 + 最大流)
由于数据范围较小,所以我们枚举答案,构造分层图求解即可。建立超级源点S和超级汇点T,然后枚举答案(即层数),每层图n+2个点,建模如下①S往地球连边,月球往T连边,边权均为INF②每个点对应的上一层的点往该点连边,边权为INF,表示人在空间站待着。③对于每个太空船,从上一时刻停靠的点向这一时刻停靠的点连一条容量为飞船容量p[i]的边,表示p[i]个人可以乘坐这艘太空船到达另一个太空...原创 2018-09-06 02:25:59 · 269 阅读 · 0 评论 -
ACM-ICPC 2018 焦作赛区网络预赛 (区间k覆盖问题)
题意T组测试数据,现在有N个点,每个点最多被选择k次,共有M条边。然后输入M条边u->v权值为w。问可以获得的最大的权值是多少? 思路区间k覆盖问题。一定要离散化!!!不离散化,边太多了,会超时。#include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5;const int...原创 2018-09-15 18:14:43 · 233 阅读 · 0 评论 -
Codeforces ~ 1082G ~ Petya and Graph (最大权闭合子图)
题意N个点M条边,每个点有一个点权,每条边有一个边权。要求选出一个子图,使得边权和-点权和最大。选这条边就必须选这条边的两个端点。思路其实就是边为正权值的点,点就是负权值的点,这样就是最大权闭合图的问题了。源点s为0,汇点t为n+m+1,边成为的点编号为[1,m],原来的点编号为[m+1,m+n]。建图如下:①s向[1,m]建边,容量为该边的边权②[m+1,m+n]向汇点建边,容量...原创 2018-12-04 21:28:38 · 426 阅读 · 0 评论