首页 > 其他 > 详细

网络流二十四题,题解summary

时间:2019-05-04 20:56:41      阅读:154      评论:0      收藏:0      [点我收藏+]

 没有全部写完,有几题以后再补吧。

第一题:最简单的:飞行员配对方案问题

讲讲这个题目为什么可以用网络流?

因为这个题目是要进行两两之间的匹配,这个就可以想到用二分图匹配,二分图匹配又可以用网络流写。

为什么二分图匹配可以用网络流写呢?

你在二分图上面加一个源点和一个汇点,然后你求从源点到汇点的最大流,这个是不是就是二分图的最大匹配。

 

第二题:最小路径覆盖问题

 

这个题目是一个特别明显的二分图问题,也用到了一个比较常见的方法拆点法,

 

这个再介绍一下拆点法这个网络流里面的基本套路该什么时候用,

 

如果你碰到一个网络流的题目,题目对每一个点有次数限制,这个时候就需要对这个点进行拆分。

 

拆分的方法有很多种,这个可以慢慢积累,也没有特别重要。

 

 

这个题目如果你对二分图定理很了解,这个就会是一个比较简单的题目了,可以学习一下二分图的定理

主要有三个:最小顶点覆盖数=最大匹配数   最大独立集=总数-最小定点覆盖数   有向无环图(DAG)最小路径覆盖数=原图上的点数-最大匹配数

这几个概念再很多地方都可以看到,尤其是最大独立集。

这个题目就是直接让你求一个图的最小路径覆盖数,这个对每一个点也有次数限制,每个点只能用一次,所以这个就要用拆分法,

不过这个题目所用的拆分法有一点点不同,一般题目都是把一个点拆成两个点,然后把这两个点连起来,连起来的这条直线的容量为1.

但是碰到这个二分图匹配问题,如果你这么连,很显然是没有意义的。

然后再分析:这个最小路径覆盖,最多的肯定是n,一共有n个点,然后我们在合并的过程中路径数量不断减少。

所以这个题目最小路径覆盖数,就是本来有的n个点再减去可以两两合并的数。

最后就是输出,这个输出就自己看代码吧。

 

 

第三题:魔术球问题

 

这个题目也是一个二分图问题,我觉得不是那么简单吧。

给你的柱子数就是最小路径数,放球条件就是建图条件,让你求可以放的最多的球数量,就是最多的点满足可以满足这个图。

这个题目要拆分,一个点连接源点,一个连接汇点,这被拆的两个点不能连起来。

每一个球,就先去遍历,如果可以和之前的一些球有建图条件,就先建图,建完图之后跑最大流(增光路),如果增广路不为0,

那就说明这个可以放在之前用的柱子里面,不然就再开一个柱子,如果柱子数最后达到n,就跳出循环。

这个为什么说增广路不为0,就说明可以放在之前的柱子里面呢?这个是因为,我们对于每一条线得容量都设为1,

所以这个就说明,每新增加一个球,如果增广路不是0,则说明它肯定和之前柱子的最上面的那个球连在了一起。

因为和下面的球就算连在了一起,也没办法增广了(容量为1)

知道了,这些建图就很简单了。这个是一个很巧妙的建图。

可以看下面的图片理解一下。

技术分享图片

 

 

 

第四题:圆桌问题

 

这个是一个二分图的多重匹配,这个题目比较简单,这个多种匹配就直接跑一个最大流好了。

 题目不是要求同一个单位的人不能坐在一起吗?那就每一个单位都向每一个桌子连一条容量为1的线,这个就可以保证

不会有一个单位的人坐在一起了,如果最大流大于等于所有单位人之和,那就可以满足,否则就不可以。

为什么会这么想呢?这个是因为我首先知道这个是一个网络流的题目,我需要建图,然后就很好做了。

 

 

第五题:试题库问题

这个题目就不说了,这个题目和圆桌问题简直一模一样。

 

 

第六题:最长不下降子序列

这个题目建图很难想,第一问就是一个裸的LIS,

主要就是第二问,这个题目我是没有想到,看了一下题解,首先要进行拆点,因为每一个点只能用一次。

这个建图就是先对这个序列进行处理,怎么处理呢?求出f数组,f[i]代表到第i位的最长不下降子序列,

如果f[i]==1,那就直接和源点相连,然后之后如果满足a[i]>=a[j]&&i>j&&f[i]==f[j]+1

那么就把j的出点和i的入点连起来。

这个就是建图,这个样子建图好难想啊。

不过看了题解之后也没有觉得特别难了,这个更加具体的解析就看看博客吧。

 

第七题:餐巾计划问题

 

网络流二十四题,题解summary

原文:https://www.cnblogs.com/EchoZQN/p/10809649.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!