网络流24题 前9题 一段话题解

网络流24题题解(无代码):

实际上网络流的题考的主要是建模能力,而非算法。

只要记住Dinic和最小费用流算法,接下来需要训练的就是抽象思维和转化。(或说刷题,也一样。)

网络流24题中虽然有一些dp题目,但总的来说仍然是极好的网络流新手训练题集,在此给出思路与题解。


1,飞行员配对方案问题
Description 


第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出
的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其中1 名是英国飞
行员,另1 名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英
国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的
外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空
军一次能派出最多的飞机。
对于给定的外籍飞行员与英国飞行员的配合情况,编程找出一个最佳飞行员配对方案,
使皇家空军一次能派出最多的飞机。


Input 


由文件input.txt提供输入数据。文件第1 行有2个正整数m和n。n是皇家空军的飞行
员总数(n<100);m是外籍飞行员数。外籍飞行员编号为1~m;英国飞行员编号为m+1~n。
接下来每行有2 个正整数i和j,表示外籍飞行员i可以和英国飞行员j配合。文件最后以2
个-1 结束。
Output 


程序运行结束时,将最佳飞行员配对方案输出到文件output.txt 中。第1 行是最佳飞行
员配对方案一次能派出的最多的飞机数M。接下来M 行是最佳飞行员配对方案。每行有2
个正整数i和j,表示在最佳飞行员配对方案中,飞行员i和飞行员j 配对。
如果所求的最佳飞行员配对方案不存在,则输出‘No Solution!’。


题解:
裸二分图匹配。
建原点s,汇点t。
每个外籍飞行员建点x,英国飞行员建点y。
s向所有x连容量为1的边,t向所有y连容量为1的边。
如果某个x和y能够配合,由x到y连容量为1的边。
从s到t跑最大流。
至于输出答案,从s出发,对于每一个x,如果s——x的边已满,则证明该外籍飞行员被征召,再从该点向外搜索,找到另一条x——y且已满的边,输出x和y即可。


2,圆桌问题。
Description 


假设有来自n 个不同单位的代表参加一次国际会议。每个单位的代表数分别为
ri,i=1,2,...,n 。会议餐厅共有m张餐桌,每张餐桌可容纳ci(i=1,2, ,m) 个代表就餐。
为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,
给出满足要求的代表就餐方案。
编程任务:
对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。
Input 


由文件input.txt提供输入数据。文件第1行有2 个正整数m和n,m表示单位数,n表
示餐桌数,1<=m<=150, 1<=n<=270。文件第2 行有m个正整数,分别表示每个单位的代表
数。文件第3 行有n个正整数,分别表示每个餐桌的容量。
Output 


程序运行结束时,将代表就餐方案输出到文件output.txt 中。如果问题有解,在文件第
1 行输出1,否则输出0。接下来的m行给出每个单位代表的就餐桌号。如果有多个满足要
求的方案,只要输出1 个方案。


题解:
最大流。
建源点s,汇点t。
每个单位建点x,每张桌子建点y。
s向每个x连容量为rx的边,t向每个边连容量为cx的边。
每个x向每个y连容量为1的边。
跑最大流即可。
(因为总人数和可容纳人数相同,所以在餐桌数大于最大的rx的情况下一定有解。)
对于每一个x,从它出发的所有边里流量满的边连向的y即为答案。


3,试题库问题
Description 


假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别
属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个
满足要求的组卷算法。
编程任务:
对于给定的组卷要求,计算满足要求的组卷方案。
Input 


由文件input.txt提供输入数据。文件第1行有2个正整数k和n (2 <=k<= 20, k<=n<= 1000)
k 表示题库中试题类型总数,n 表示题库中试题总数。第2 行有k 个正整数,第i 个正整数
表示要选出的类型i 的题数。这k个数相加就是要选出的总题数m。接下来的n行给出了题
库中每个试题的类型信息。每行的第1 个正整数p表明该题可以属于p类,接着的p个数是
该题所属的类型号。
Output 


程序运行结束时,将组卷方案输出到文件output.txt 中。文件第i 行输出 “i:”后接类
型i的题号。如果有多个满足要求的方案,只要输出1 个方案。如果问题无解,则输出“No Solution!”。
题解:
二分图多重匹配。最大流。
建源点s,汇点t。
每道题建点x,每个类型建点y。
s向每个x建容量为1的边,t向每个y建容量为ky的边。
对于每一个x,向它所属的全部类型y建容量为1的边。
跑最大流即可。


4,太空飞行计划问题
Description 


W 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业
性实验而获取利润。现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这
些实验需要使用的全部仪器的集合I={I1,I2,…In}。实验Ej需要用到的仪器是I的子集Rj。
配置仪器Ik的费用为ck美元。实验Ej的赞助商已同意为该实验结果支付pj美元。W教授的
任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才
能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部
费用的差额。
«编程任务:
对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。
Input 


由文件input.txt提供输入数据。文件第1行有2个正整数m和n。m是实验数,n是仪
器数。接下来的m 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费
用;接着是该实验需要用到的若干仪器的编号。最后一行的n个数是配置每个仪器的费用。
Output 


程序运行结束时,将最佳实验方案输出到文件output.txt 中。第1 行是实验编号;第2
行是仪器编号;最后一行是净收益。


题解:
先建图。
设源点s,汇点t。
每一个实验建点x,仪器建点y。
s向每个x连容量为px的边,每个y向t连容量为cy的边。
对于每个x,向它所依赖的仪器连容量为inf的边。
假设选中的仪器集合为U,可做的实验集合为V。
设仪器需消耗a元,实验会赚得b元,所有试验共可赚得c元。
则没有做的实验为c-b元。
只需最小化a+(c-b)即可。
如果把U和E-V和它们发出的所有的边删掉,则该图变为不连通的。
求最小割。
最小割等于最大流。
求最大流。


5,餐巾计划问题
Description 


一个餐厅在相继的N 天里,每天需用的餐巾数不尽相同。假设第i天需要ri块餐巾(i=1,
2,…,N)。餐厅可以购买新的餐巾,每块餐巾的费用为p分;或者把旧餐巾送到快洗部,
洗一块需m天,其费用为f 分;或者送到慢洗部,洗一块需n 天(n>m),其费用为s< f 分。
每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多
少块保存起来延期送洗。但是每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。
试设计一个算法为餐厅合理地安排好N 天中餐巾使用计划,使总的花费最小。
编程任务:
编程找出一个最佳餐巾使用计划.
Input 


由文件input.txt提供输入数据。文件第1 行有6 个正整数N,p,m,f,n,s。N 是要安排餐巾
使用计划的天数;p 是每块新餐巾的费用;m 是快洗部洗一块餐巾需用天数;f 是快洗部洗
一块餐巾需要的费用;n是慢洗部洗一块餐巾需用天数;s是慢洗部洗一块餐巾需要的费用。
接下来的N 行是餐厅在相继的N 天里,每天需用的餐巾数。
Output 


程序运行结束时,将餐厅在相继的N 天里使用餐巾的最小总花费输出到文件output.txt
中。
题解:
当年我以为这是道dp。
无法回首的过去。
建源点k,汇点t。
每一天拆成两个点x和y,分别代表当天需要的餐巾和当天用完的餐巾。
首先,从k向每个x连流量为inf,费用为p的边。
其次,从每个y向t连流量为Ny,费用为0的边。
接下来,从每个y向下一个y连流量为inf,费用为0的边。(保存不洗的餐巾)
然后,从每个yi向x(i+m)连流量为inf,费用为f的边;向x(i+n)连流量为inf,费用为s的边。(快洗部和慢洗部)。
最后,从每个x向对应的y连流量为Ny,费用为0的边。
跑最小费用流即可。


6,方格取数问题
Description 


在一个有m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任
意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。
编程任务:
对于给定的方格棋盘,按照取数要求编程找出总和最大的数。
Input 


由文件input.txt提供输入数据。文件第1 行有2 个正整数m和n,分别表示棋盘的行数
和列数。接下来的m行,每行有n个正整数,表示棋盘方格中的数。
n,m<=30。
Output 


程序运行结束时,将取数的最大总和输出到文件output.txt中。


题解:
使取出的数最大=使不取的数最小。
最小割。
最大流。
所有数总和-最小费用流。
将格子黑白相间染色,黑色连源点,白色连汇点,容量为1,费用为格点权值。
每个相邻格子连边,容量为inf,费用为0.
跑最小费用流即可。


7,最小路径覆盖问题
Description 


给定有向图G=(V,E)。设P 是G 的一个简单路(顶点不相交)的集合。如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖。P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0。G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖。
设计一个有效算法求一个有向无环图G 的最小路径覆盖。


Input 


由文件input.txt提供输入数据。文件第1 行有2个正整数n和m。n是给定有向无环图
G 的顶点数,m是G 的边数。接下来的m行,每行有2 个正整数i和j,表示一条有向边(i,j)。
Output 


程序运行结束时,将最小路径覆盖输出到文件output.txt 中。从第1 行开始,每行输出
一条路径。文件的最后一行是最少路径数。


题解:
直接建模不可行,考虑拆点。
将每个点拆成x和y两个点,分别代表指向该点的边和从该点指出去的边。
如果某两个点之间有边,就从出发点的y指向到达点的x连一条容量为1的边。
源点向所有x连一条容量为1的边。所有y向汇点连一条容量为1的边。
跑最大流。再用总点数-最大流。
(每多一条边被连上,最小路径覆盖就-1.)


8,分配问题
Description 


有n件工作要分配给n个人做。第i 个人做第j 件工作产生的效益为Cij 。试设计一个将
n件工作分配给n个人做的分配方案,使产生的总效益最大。
编程任务:
对于给定的n件工作和n个人,计算最优分配方案和最差分配方案。
Input 


由文件input.txt提供输入数据。文件的第1 行有1 个正整数n,表示有n件工作要分配
给n 个人做。接下来的n 行中,每行有n 个整数Cij ,1≤i≤n,1≤j≤n(n<=100),表示第i 个人做
第j件工作产生的效益为Cij。
Output 


程序运行结束时,将计算出的最小总效益和最大总效益输出到文件output.txt中。


题解:
最小/最大费用流。
每个人向每个工作连容量为1,费用为Cij的边。
建源点,汇点。
跑最小/最大费用流即可。


9,骑士共存问题
Description 


在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示。棋盘
上某些方格设置了障碍,骑士不得进入。




对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑
士,使得它们彼此互不攻击。
Input 


由文件input.txt给出输入数据。第一行有2 个正整数n 和m ( 1 <= n <= 200, 0 <= m < n^2 ),
分别表示棋盘的大小和障碍数。接下来的m 行给出障碍的位置。每行2 个正整数,表示障
碍的方格坐标。
Output 


将计算出的共存骑士数输出到文件output.txt。


题解:
跟方格取数问题一个性质。
黑白染色。连源连汇,费用1,容量1。
对于每一个点,向所有它可以攻击的点(非障碍)连费用0,容量inf的边。
跑最小费用流。
总骑士数-费用流即可。

你可能感兴趣的:(网络流24题 前9题 一段话题解)