zky学长不止一次说分层图很简单随便看看就会了
然后今天就拿出时间来学了学分层图(写这篇文章是不是会被骂傻叉算了反正我就是傻叉)
首先@出一篇论文
2004国家集训队《分层图思想及其在信息学竞赛中的应用》肖天
————————————我是分割线>w<——————————————
裸的最短路和网络流题目大家都会,就算是需要把模型抽象分析一下才能得出也已经不算什么了
但是如果在最短路和网络流的基础上加入一些干扰操作呢?
比如我们可以进行一些操作让图中某些边的边权或者容量减半(beijingwc2012 冻结)而这些操作不是预先给出的是需要我们自己选择一些边进行减半的呢?
很显然对于这种情况普通最短路和网络流是没有办法处理的。
所以需要用到分层图的思想。
所谓分层图,就是状态是多维的一个巨大的图,正常的最短路我们是在一个二维的图中进行的,而用到分层图的时候就需要在多维空间内进行。
通常情况下需要用到分层图思想的题目都有一些干扰操作(常见的就是可以将边权减少什么的)(P.S.前提是这些操作的数目不太大),我们对这些干扰操作的解决方法就是把原图“复制”,而且一般来说干扰操作有多少次就要复制多少。
你没看错就是复制。
这时候有的人就会开始吐槽了:你要复制一个图,不管时间还是空间都存在巨大的花费,说不定光复制就炸了(╯‵□′)╯︵┻━┻而且如果再对每个图做一遍最短路(网络流),早就炸掉了好吗(╯‵□′)╯︵┻━┻
图样图森破啊少年>_<
肖天在原文中的观点(我给提炼了一下)是:
每一层图都是由唯一的原图复制来的,因此这些不同层次的图就具有一些相同的性质。因此很多时候所谓的复制其实只需要我们在逻辑上把图当成很多层图来处理,分析出层的概念,根本不需要在程序里进行新图的存储。
而且这些不同层次的图有相似的性质,大部分时候我们的计算结果是相似或者相同的,因此只要计算一次,存储结果,而不需要反复计算,因此不会导致问题的规模变大。
层之间是拓扑有序的。这也就意味着在层之间可以很容易实现递推等处理,为发现有效算法打下了良好的基础。
不过在实际中我发现,我们还是需要建新的图的(或许我没有理解肖天在原文中说不用对新层进行存储的意思?)
然而计算大概是(所以不要喷我只是我觉得是这样的)确实应当只有一遍,因为我们会在不同层次图的点之间连起新的边。
如果你不信的话,我可以给几个关于某道裸题的题解链接。反正我是看过之后这么总结出来的。。。真的不对的话请快快QQ喊我
Beijingwc2012 冻结
JLOI2011飞行路线
就是这样>w<
原文地址:http://blog.csdn.net/creationaugust/article/details/44311285