目录

  • A、飞行员配对方案问题 (二分图最大匹配)(最大流)【提高+/省选- 】
  • B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)【省选/NOI- 】
  • C、最小路径覆盖问题(有向无环图最小路径覆盖)(拆点)(最大流)【省选/NOI- 】
  • D、魔术球问题(有向无环图的最小路径覆盖、思维)【省选/NOI- 】
  • E 、圆桌问题(二分图多重匹配)(最大流)【省选/NOI- 】
  • I、 方格取数问题(二分图的最大独立集/最小割)【省选/NOI- 】
  • K、航空路线问题(最小费用最大流)
  • Q、运输问题(最大费用最大流 + 最小费用最大流)【省选/NOI- 】
  • X、骑士共存问题(最大独立集)(匈牙利 / 最大流)

最详细(也可能现在不是了)网络流建模基础 (近乎完整的全套问题建模方法)

xht的二分图与网络流 学习笔记

*【题解】网络流24题 24/24

*网络流24题 题解

[线性规划与网络流24题] 网络流常见模型

一些前置知识

  • 最大匹配数:最大匹配的匹配边的数目

  • 最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择

  • 最大独立数:选取最多的点,使任意所选两点均不相连

  • 最小路径覆盖数:对于一个 DAG(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径。路径长可以为 0(即单个点)。

  • 定理1:最大匹配数 = 最小点覆盖数(这是 Konig 定理)

  • 定理2:最大匹配数 = 最大独立数

  • 定理3:最小路径覆盖数 = 顶点数 - 最大匹配数

整理的算法模板合集: ACM模板


问题编号 问题名称 问题模型 转化模型
A 飞行员配对方案问题 二分图最大匹配 网络最大流
B 太空飞行计划问题 最大权闭合图 网络最小割
C 最小路径覆盖问题 有向无环图最小路径覆盖 网络最大流
D 魔术球问题 有向无环图最小路径覆盖 网络最大流
E 圆桌问题 二分图多重匹配 网络最大流
F 最长递增子序列问题 最多不相交路径 网络最大流
G 试题库问题 二分图多重匹配 网络最大流
H 机器人路径规划问题 未解决,假题 最小费用最大流
I 方格取数问题 二分图点权最大独立集 网络最小割
J 餐巾计划问题 线性规划网络优化 最小费用最大流
K 航空路线问题 最长不相交路径 最小费用最大流
L 软件补丁问题 最小转移代价 最短路径
M 星际转移问题 网络判定 网络最大流
N 孤岛营救问题 分层图最短路径 最短路径
O 汽车加油行驶问题 分层图最短路径 最短路径
P 数字梯形问题 最大权不相交路径 最小费用最大流
Q 运输问题 网络费用流量 最小费用最大流
R 分配问题 二分图最佳匹配 最小费用最大流
S 负载平衡问题 最小代价供求 最小费用最大流
T 深海机器人问题 线性规划网络优化 最小费用最大流
U 最长k可重区间集问题 最大权不相交路径 最小费用最大流
V 最长k可重线段集问题 最大权不相交路径 最小费用最大流
W 火星探险问题 线性规划网络优化 最小费用最大流
X 骑士共存问题 二分图最大独立集 网络最小割

注:部分题解借鉴 线性规划与网络流24题解题报告

A、飞行员配对方案问题 (二分图最大匹配)(最大流)【提高+/省选- 】


【问题分析】

二分图最大匹配问题。

【建模方法】

在二分图的基础上增加源S和汇T。 1、S向X集合中每个顶点连一条容量为1的有向边。 2、Y集合中每个顶点向T连一条容量为1的有向边。 3、XY集合之间的边都设为从A集合中的点到B集合之中的点,容量为1的有向边。

  • 节点
源点:0
外国人:1->m
本国人:m+1->n
汇点:n+1
(源点,外国人,1)
(外国人,本国人,INF)
(本国人,汇点,1)

求网络最大流,流量就是匹配数,所有满流边是一组可行解。

【建模分析】

基本的二分图最大匹配,可以直接用匈牙利算法或Hopcroft_Karp算法解决,更一般的方法是网络最大流。

求出的最大流即为最多的匹配对数。

要得到匹配方案,既是判断各边是否有流量,即判断反向边的权值是否不为0。
有流量的边即为要输出的匹配对。


我是代码


B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)【省选/NOI- 】

【问题分析】

最大权闭合图问题,可以转化成最小割问题,进而用最大流解决。

【建模方法】

把每个实验看作二分图X集合中的顶点,每个设备看作二分图Y集合中的顶点,增加源S和汇T。
1、从S向每个Xi连接一条容量为该点收入的有向边。
2、从Yi向T连接一条容量为该点支出的有向边。
3、如果一个实验i需要设备j,连接一条从Xi到Yj容量为无穷大的有向边。

统计出所有实验的收入只和Total,求网络最大流Maxflow,最大收益就是Total-Maxflow。对应的解就是最小割划分出的S集合中的点,也就是最后一次增广找到阻塞流时能从S访问到的顶点。

【建模分析】

定义一个割划分出的S集合为一个解,那么割集的容量之和就是(未被选的A集合中的顶点的权值 + 被选的B集合中的顶点的权值),记为Cut。A集合中所有顶点的权值之和记为Total,那么Total - Cut就是(被选的A集合中的顶点的权值 - 被选的B集合中的顶点的权值),即为我们的目标函数,记为A。要想最大化目标函数A,就要尽可能使Cut小,Total是固定值,所以目标函数A取得最大值的时候,Cut最小,即为最小割。

该问题的一般模型为最大权闭合图,相关讨论见《最小割模型在信息学竞赛中的应用》作者胡伯涛。
【反思与总结】
最后的输出方案:
用Dninc求最大流的好处是便于我们输出,因为层数如果为INF,那么显然该边容量大于0,这就说明这条边并没有流量流过,那么显然与它相连的实验或者器材没有被使用(因为使用过的话,边的容量会变为0),直接输出即可。

我是代码

C、最小路径覆盖问题(有向无环图最小路径覆盖)(拆点)(最大流)【省选/NOI- 】

拆点最大流

【问题分析】

有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决。

【建模方法】

构造二分图,把原图每个顶点i拆分成二分图X,Y集合中的两个顶点Xi和Yi。对于原图中存在的每条边(i,j),在二分图中连接边(Xi,Yj)。然后把二分图最大匹配模型转化为网络流模型,求网络最大流。

最小路径覆盖的条数,就是原图顶点数,减去二分图最大匹配数。沿着匹配边查找,就是一个路径上的点,输出所有路径即可。

【建模分析】

对于一个路径覆盖,有如下性质:

1、每个顶点属于且只属于一个路径。 2、路径上除终点外,从每个顶点出发只有一条边指向路径上的另一顶点。

所以我们可以把每个顶点理解成两个顶点,一个是出发,一个是目标,建立二分图模型。该二分图的任何一个匹配方案,都对应了一个路径覆盖方案。如果匹配数为0,那么显然路径数=顶点数。每增加一条匹配边,那么路径覆盖数就减少一个,所以路径数=顶点数 - 匹配数。要想使路径数最少,则应最大化匹配数,所以要求二分图的最大匹配。

  • 节点:
源点0, 汇点1
图中第i个点: 左部分i, 右部分i + n
  • 弧:
(源点,左部分点,1)
(右部分点,汇点,1)
(i的左部分,j的右部分,1),前提是原图中i到j有一条有向边
  • 最大流:
(点数-最大流)即为最小路径覆盖
  • 输出答案
    输出答案时,可以依次遍历未被访问的所有点,首先沿着反向弧找到路径起点,再依次输出并标记访问过即可。

注意,此建模方法求最小路径覆盖仅适用于有向无环图,如果有环或是无向图,那么有可能求出的一些环覆盖,而不是路径覆盖。

最后的方案可以利用残量网络用并查集维护。
即从1到n枚举,从每个点向外扫一圈,如果有流从这条边经过,并流向y+n,则合并x与y。
根据网络流的残余流量构造每一条路径(利用并查集维护路径起点),然后从起点递归输出。


我是代码


D、魔术球问题(有向无环图的最小路径覆盖、思维)【省选/NOI- 】

P2765 魔术球问题

【问题分析】

枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决。

【建模方法】

枚举答案A,在图中建立节点1…A。如果对于i<j有i+j为一个完全平方数,连接一条有向边(i,j)。该图是有向无环图,求最小路径覆盖。如果刚好满足最小路径覆盖数等于N,那么A是一个可行解,在所有可行解中找到最大的A,即为最优解。

具体方法可以顺序枚举A的值,当最小路径覆盖数刚好大于N时终止,A-1就是最优解。

【建模分析】

由于是顺序放球,每根柱子上的球满足这样的特征,即下面的球编号小于上面球的编号。抽象成图论,把每个球看作一个顶点,就是编号较小的顶点向编号较大的顶点连接边,条件是两个球可以相邻,即编号之和为完全平方数。每根柱子看做一条路径,N根柱子要覆盖掉所有点,一个解就是一个路径覆盖。

最小路径覆盖数随球的数量递增不递减,满足单调性,所以可以枚举答案(或二分答案),对于特定的答案求出最小路径覆盖数,一个可行解就是最小路径覆盖数等于N的答案,求出最大的可行解就是最优解。本问题更适合枚举答案而不是二分答案,因为如果顺序枚举答案,每次只需要在残量网络上增加新的节点和边,再增广一次即可。如果二分答案,就需要每次重新建图,大大增加了时间复杂度。

优化: 为了避免每次枚举都需要求网络流带来的时间浪费,每次求网络流前把所有弧的当前流置0,即可接着上一次的图直接插入再求。

输出方案: 从1到最大球数枚举,依次找到每个球的左部分连着哪个球的右部分,即可输出每个柱子上的答案。可以直接对着最后ans+1个球的网络图输出答案,注意判断边界即可。

  • 节点
源点:100001
汇点:100002
∴数组要开到100005
第i个球:左部分i∗2,右部分i∗2+1
(源点,左部分,1)
(右部分,汇点,1)
(i的左部分,j的右部分,1)要求i<j且i+j为完全平方数
  • 最大流
最大流表示把这些球放上去之后,能省下几根柱子。
即,设球数为b,最大流为mf,则(b-mf)根柱子可以容纳b个球。
依次枚举每个球数对应的柱子数,直到得到n个柱子最多放下的球数为止。

【总结与反思】

这道题代码写起来还是比较简单的,都是模板,但是如何把这道题往网络流的方向去想非常关键。单是看这道花里胡哨的题是不可能想到还能转换为二分图跑最大流。

因此像这种题,就引入了一个“隐式图”的概念。

隐式图顾名思义,大白话来讲就是题目看着不像是图论,但是可以通过一些限制或关联进行建点,连边,最终通过图论的一些算法来求解。
那么就此题来看,经思考一会可发现这题的柱子并没有什么实际的作用,所有的操作都是关于珠子的编号的。那么我们可以以每一个珠子为点,若满足条件(编号相加为平方数)就两两连边,那么就可得到一张图,我们再把每一个点进行拆点,就把整张图拆成了一张二分图,最多的珠子实际上就是最长的路径,尽可能少的柱子实际上就是最小路径覆盖。然后跑最大流就行了。
至于最后的输出,在dfs的时候把走的当前的增广路用邻接表(链式前向星)存一下,直接输出即可。
上述隐式图来源


我是代码


E 、圆桌问题(二分图多重匹配)(最大流)【省选/NOI- 】


可以直观的想到,二分图的左边是单位,右边是桌子
由于题目的限制 每个单位只能在一个桌子坐一个人
所以我们就把每个单位向各个桌子连一道流量为1的边,这样每次流一次一个单位只能贡献1个流量,也就是一个人到一个桌子上,满足题意。

然后由超级源点与每个单位连接,边的权值为单位人数
由每个圆桌与超级汇点连接,边的权值为圆桌人数

然后跑一下最大匹配 如果最大匹配数等于所有单位的人数和
那么就可以 完全安排 否则不能完全安排
然后再枚举一下,如果剩余流量 == 0则该点为方案之一,输出即可。

然后我因为用了成对变换而tot没有赋初值1而WA了一个小时没有找到bug。。。以后tot只写1.


我是代码


I、 方格取数问题(二分图的最大独立集/最小割)【省选/NOI- 】


【问题分析】

二分图点权最大独立集,转化为最小割模型,从而用最大流解决。

【建模方法】

首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图X集合中顶点,白色格子看做Y集合顶点,建立超级源点S超级汇点T。

1、从S向X集合中每个顶点连接一条容量为格子中数值的有向边。
2、从Y集合中每个顶点向T连接一条容量为格子中数值的有向边。
3、相邻黑白格子Xi,Yj之间从Xi向Yj连接一条容量为无穷大的有向边。

求出网络最大流,要求的结果就是所有格子中数值总和减去最大流量(最小割)。

【建模分析】

这是一个二分图最大点权独立集问题,就是找出图中一些点,使得这些点之间没有边相连,这些点的权值之和最大。独立集与覆盖集是互补的,求最大点权独立集可以转化为求最小点权覆盖集(最小点权支配集)。最小点权覆盖集问题可以转化为最小割问题解决。结论:最大点权独立集 = 所有点权 - 最小点权覆盖集 = 所有点权 - 最小割集 = 所有点权 - 网络最大流。

对于一个网络,除去冗余点(不存在一条ST路径经过的点),每个顶点都在一个从S到T的路径上。割的性质就是不存在从S到T的路径,简单割可以认为割边关联的非ST节点为割点,而在二分图网络流模型中每个点必关联到一个割点(否则一定还有增广路,当前割不成立),所以一个割集对应了一个覆盖集(支配集)。最小点权覆盖集就是最小简单割,求最小简单割的建模方法就是把XY集合之间的变容量设为无穷大,此时的最小割就是最小简单割了。

有关二分图最大点权独立集问题,更多讨论见《最小割模型在信息学竞赛中的应用》作者胡伯涛。

【反思与总结】

一开始我没看懂题意,卡了一会,才明白不是只能取一次,而是可以随意取但是所有取的点之间都不能直接相邻。求最大的答案。

实际上可以看作我们把所有的点都取了,然后把所有的权值最小的都去掉,也就是最小割(最小割就是割掉权值最少的边使得所有的点都独立,也就是二分图的两个集合都分开,我们根据题意把不能相邻需要分开的点分别作为左集合与右集合相连,再全部分开)


我是代码


K、航空路线问题(最小费用最大流)


【问题分析】

求最长两条不相交路径,用最大费用最大流解决。

【建模方法】

把第i个城市拆分成两个顶点<i.a>,<i.b>。

1、对于每个城市i,连接(<i.a>,<i.b>)一条容量为1,费用为1的有向边,特殊地(<1.a>,<1.b>)和(<N.a>,<N.b>)容量设为2。
2、如果城市i,j(j>i)之间有航线,从<i.b>到<j.a>连接一条容量为1,费用为0的有向边。

求源<1.a>到汇<N.b>的最大费用最大流。如果(<1.a>,<1.b>)不是满流,那么无解。否则存在解,即为最大费用最大流量 - 2。

【建模分析】

每条航线都是自西向东,本题可以转化为求航线图中从1到N两条不相交的路径,使得路径长度之和最大。转化为网络流模型,就是找两条最长的增广路。由于每个城市只能访问一次,要把城市拆成两个点,之间连接一条容量为1的边,费用设为1。因为要找两条路径,所以起始点和终点内部的边容量要设为2。那么费用流值-2就是两条路径长度之和,为什么减2,因为有两条容量为2的边多算了1的费用。求最大费用最大流后,如果(<1.a>,<1.b>)不是满流,那么我们找到的路径不够2条(可能是1条,也可能0条),所以无解。

我是代码


Q、运输问题(最大费用最大流 + 最小费用最大流)【省选/NOI- 】


【问题分析】

费用流问题。

【建模方法】

把所有仓库看做二分图中顶点Xi,所有零售商店看做二分图中顶点Yi,建立附加源S汇T。

1、从S向每个Xi连一条容量为仓库中货物数量ai,费用为0的有向边。
2、从每个Yi向T连一条容量为商店所需货物数量bi,费用为0的有向边。
3、从每个Xi向每个Yj连接一条容量为无穷大,费用为cij的有向边。

求最小费用最大流,最小费用流值就是最少运费,求最大费用最大流,最大费用流值就是最多运费。

【建模分析】

把每个仓库想象成一个中转站,由源点运来ai单位货物,运费为0,每个商店也为一个中转站,运向目标汇点bi单位货物。每个仓库和零售商店之间有一条道路,容量为无穷大,费用为单位运费cij。求从源点到汇点的费用流,就是运费。


我是代码


X、骑士共存问题(最大独立集)(匈牙利 / 最大流)

【问题分析】

二分图最大独立集,转化为二分图最大匹配,从而用最大流解决。

【建模方法】

首先把棋盘黑白染色,使相邻格子颜色不同。把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点。建立附加源S汇T,从S向X集合中每个顶点连接一条容量为1的有向边,从Y集合中每个顶点向T连接一条容量为1的有向边。从每个可用的黑色格子向骑士一步能攻击到的可用的白色格子连接一条容量为无穷大的有向边。求出网络最大流,要求的结果就是可用格子的数量减去障碍数再减去最大流量。

【建模分析】

用网络流的方法解决棋盘上的问题,一般都要对棋盘黑白染色,使之成为一个二分图。放尽可能多的不能互相攻击的骑士,就是一个二分图最大独立集问题。有关二分图最大独立集问题,更多讨论见国家队论文《最小割模型在信息学竞赛中的应用》作者胡伯涛。

本题数据范围200, 如果按照奇数建图可以用匈牙利算法侥幸AC,正解还是应该使用最大流算法。


我是代码


解题报告:线性规划与网络流24题相关推荐

  1. [线性规划与网络流24题] 网络流常见模型

    最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...

  2. 囧——线性规划与网络流24题之网络流入门经典

    搞了好久终于搞定线性规划与网络流24题,不过机器人路径至今无解,第22题感觉是数据错了~~~ 我的代码,数据和题目题解是BYVoid那弄到的:http://download.csdn.net/sour ...

  3. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

  4. 【线性规划与网络流24题】汽车加油行驶问题 分层图

    汽车加油行驶问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 给定一个 N*N的方形网格,设其左上角为起点◎,坐标为( 1,1),X轴向右为 ...

  5. 【线性规划和网络流24题】

    (1)飞行员配对方案问题:二分图最大匹配. 思路:略. View Code 1 #include<cstdio> 2 #include<cstring> 3 #define M ...

  6. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

  7. 线性规划与网络流24题 运输问题(最裸的费用流了)

    存费用流模板 用sfpa算出最小费用和路径,沿这条路径增广 1 const 2 inf=maxlongint; 3 var 4 n,m:longint; 5 map,a,w:array[0..120, ...

  8. 线性规划与网络流24题●09方格取数问题13星际转移问题

    ●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为"技术"不佳,搞了一上午) ●09方格取数问题(codevs1907  方格取数3) 想了半天,也没 ...

  9. 线性规划与网络流24题 负载平衡问题

    题目描述 Description G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最     少搬运量可以使n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运 ...

最新文章

  1. dSploitzANTI渗透教程之安装zANTI工具
  2. python打开360浏览器_python selenium使用360浏览器出现新皮肤设置怎么办?
  3. php中return返回数组,PHP中return返回数组的一点用法
  4. ajax动态获取url参数值,获取URL参数的方法
  5. 双十一丨你负责买买买 我做你背后的那个数据人
  6. Maven学习总结(34)——Maven settings.xml配置解读
  7. _blank开新窗口不符合标准?
  8. postgresql命令行
  9. 服务器2008r2网络禁止修改,windows-server-2008-r2 – Windows 2008 R2标准服务器 – 如何禁用RC4...
  10. spark安装及环境配置(win10)
  11. Layer 7 过滤 (官网介绍)
  12. B站视频下载(含bv快速变回av)
  13. 【资料】舵机控制原理
  14. CD4040二进制计数器实验电路的效果图演示_基础硬件电路图讲解
  15. 转载,近三年知名实验室slam有关论文。
  16. 网络摄像头RTSP流媒体协议视频平台EasyNVR如何进行延迟测试?
  17. 3D打印机DIY之五------切片软件Cura的使用
  18. 【中文分词】基于ICTCLAS的Python中文分词
  19. 彩云之巅(一) 回忆的牵绊
  20. 多线程使用场景(经典必看)

热门文章

  1. ImageNet 的衰落
  2. 2-Entity RANSAC:在变化的环境中进行稳健的视觉定位
  3. 移动端最强适配(rem适配之px2rem) 移动端结合Vuex实现简单loading加载效果
  4. (原創) 如何將編譯結果,統一放在一個目錄下? (SOC) (Quartus II)
  5. 服务器越来越慢的原因及解决办法
  6. 二维“玄”如何“抖动”出三维世界?
  7. 关于C语言中的一些注意问题的小记之一----+号使用
  8. Apache 的prefork MPM和worker MPM
  9. [转]Effective C# 原则5:始终提供ToString()
  10. nvidia旧版驱动_N卡用户注意:老版驱动存在5个高危漏洞,赶紧更新