网络流24题

本文详细介绍了24道涉及网络流算法的题目,包括飞行员配对方案、太空飞行计划、最小路径覆盖等。通过二分图最大匹配、最小割等方法,解析如何利用网络流解决实际问题,如最长不下降子序列、机器人路径规划等。部分题目如航空路线问题、软件补丁问题等,可采用最大费用流或最短路算法进行求解。

先简单写写题解,后面再更新图片啥的

飞行员配对方案问题

二分图最大匹配+输出路径,简单题

太空飞行计划问题

最大权闭合图,最大闭合子图解= ∑ p i − m a x f l o w \sum{p_i}-maxflow pimaxflow,同时发现利用d数组就能完成输出方案,因为这个相当于求一个最小割,最小割由d数组可以很好地求方案

最小路径覆盖问题

将图按照二分图的方法建图,然后跑一个最大匹配,因为二分图的每个匹配,相当于在原图中加了一条边,那么答案很明显就是 n − m a x f l o w n-maxflow nmaxflow

魔术球问题

有了上面这个题的基础,发现也是一个最小路径覆盖问题。将每个数字和比自己大且和为平方数的数连边,然后就和上个题一样了,二分,判断是否可行的时候就是判断下路径数是否合法

圆桌问题

二分图多重匹配,只要将源点和一段的连线改变下权值即可。
这里其实能够发现,二分图的输出路径是非常方便的,因为本身就是最大流,所以根据流量就能判断,而且二分图标号也是确定且连续的

试题库问题

还是二分图多重匹配,把上面的代码拉过来改改就行

最长不下降子序列问题

首先求出每一位的dp[i],然后,因为每个数字最多使用一次,所以要拆点。利用分层思想,将 i &lt; j i&lt;j i<j a [ i ] ≤ a [ j ] a[i]\leq a[j] a[i]a[j] d p [ i ] + 1 = d p [ j ] dp[i]+1=dp[j] dp[i]+1=dp[j]的建边,同时让 d p [ i ] = 1 dp[i]=1 dp[i]=1的与源点建边, d p [ i ] = k dp[i]=k dp[i]=k的与汇点建边,这样答案就是最大流,具体思路就是分层思路,你每多走一条边,其实就是在dp中多匹配了一位。
第三问,则是将1和1+n,n和2n的流设为无限大,源点和1的也可以设为无限大,但是2*n和汇点则需要考虑下dp[n]的值,意思很好理解,因为源点的流会被汇点所限制,同时只有达到最长的才能被接受

机器人路径规划问题

文献
似乎数据有问题+不是网络流,坑了

方格取数问题

首先这是一个二分图,相当于求一个带权二分图最大独立集,二分图最大独立集答案为 n − m a x f l o w n-maxflow nmaxflow,这个图有权值,可以将源点向左边点建立流量为a[i]的边,右边的点向汇点建立流量为a[i]的边,中间则是左边向右边建立流量为inf的边,注意,不能再建立右边向左边,因为那样相当于左右都是无限大的流量(再次明白了,二分图建边要谨慎)

餐巾计划问题

有点难想的费用流,首先,这道题是第一见到拆点后两点不连边的。
我们将一天当作两个点,左边是干净,右边是脏,中间不能连边,因为源点与汇点向左右的连边相当于完成了这个过程。
此题还有一个trick,就是当我们将一些物品处理好后,可以在i,i+1之间连边,这么做的意义就是将物品传递下去,而不是将处理好的点不停向下建边

航空路线问题

首先每个点一次,那么就是拆点+流量为1,要经过的点最多,就是最大费用流,来回路径都需要,可以看作起点跑两次,所以源点到1流量为2,汇点到终点流量为2。最大流输出路径就是不停判c即可。这个题要特判下1直达n的情况

软件补丁问题

因为只有20个点,所以可以开1<<20个状态,那么接下来就很简单了,因为总条件数只有100,所以将这些当作边,跑个最短路就行了,因为是这种转移方式,所以状压dp应该也可以。不过其实复杂度是错的,能过是因为难以无法构造达到复杂度上限的数据
如果非要跑网络流,那就是和最短路一样,不建边,跑得时候判断边,跑最小费用流

[CTSC1999]家园

很奇妙的题,这个题解决的是当边呈现周期性变化的时候应该怎么做。不过方法很无脑,就是将点开出每个时间的状态,时间之间流Inf

孤岛营救问题

n,m,p都只有10,意味着所有状态为 n ∗ m ∗ 2 p n*m*2^p nm2p=102400,所以直接bfs就行了。似乎有人写的是分层图最短路,因为分层后点数巨大,不能暴力建边,只能在原图建边,建边的意义是判断转移依据,这样就能让多个图一起使用了,但是因为边权一定是1,而且也是要跑满所有状态的,所以意义不大
这题和网络流有什么关系,大概是因为这个有一点分层图思想吧

汽车加油行驶问题

这个题就比上面那个题好多了,这里不能bfs了,必须要跑最短路,同样是个分层图最短路(我觉得所谓的分层,就是到达当前点有多种状态,而边则是所有状态下都建立的约束状态)

数字梯形问题

简单的费用流,第一问,因为什么都只能走一次,所以建的时候流量都是1,第二问,因为点可以走两次,那么拆点之间的流量为Inf,第三问,因为可以乱走,所以除了源点和第一层的流量是1,其余都是Inf即可

运输问题

费用流模板。。。

分配工作问题

和上面一模一样的费用流模板。。。

负载平衡问题

费用流,让每个数都减去平均数,然后正数连源点,负数连汇点,相邻的连边,然后跑一次就行了,这里能够发现,无向图跑费用流要建两次边,而最大流只需要正向反向都是z即可

深海机器人问题

这个题目问题在于,一条边只有第一次经过有价值,但是可以无限次经过怎么处理。处理方法是建立两次边,第一次流量为1,价值为c,第二次流量为Inf,价值为0

最长k可重区间集问题

一堆线段,一个点最多被选择k次,一个线段价值为长度,问最大价值
orz
建模:上面连接的第二种建图方法,离散所有数字,相邻数字连inf,然后有线段的连接,且费用为线段价值。说起来不直观,不如点上面链接看图。能发现,这样建模之所以正确是因为最大流量为k,那么一个点最多被经过k次,而网络流保证了最优,故答案最优

最长k可重线段集问题

和上题几乎沒区别

骑士共存问题

最大独立解裸题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值