分层图与拆点
引入
想写这个是因为最近碰到了好多次分层图,但是对概念还是很模糊,简单记录一下自己的一些理解。
我最大的混沌的点是,我最开始的时候将拆点与分层图,一直分的不是太清楚,或者说两者我都不是太清楚。最近稍微理清了一下
接下来,我分别说一下我对拆点和分层图的理解。
拆点
拆点,其实是很简单,很基础的一个知识点。
适用场景
就是说,如果一个点所表示的含义,已经不能满足我们题目所需要求的内容时,我们就多加状态,从而满足我们的需求。
我们从最简单的例子出发
在一个网格中我们限定,如果你进入向右进入某一个格点,那接下来只能向下或向上走。其余随便,求从(1,1)到(n,m)的最短路。
那,显然我们只记录格点坐标已经不够了,我们应当再加一维方向。这样我们就可顺利的求出最短路了。
分层图
适用场景
一些图论题,比如最短路、网络流等,题目对边的权值提供可选的操作,比如可以将一定数量的边权减半,在此基础上求解最优解。或者是,当题目中点的状态除了编号外,还需要其他状态来区分点,我们也会进行分层图。发现了嘛,拆点在这里就用起来了,我们可以说拆点是分层图的实现过程。
算法思路
根据是否进行题目提供的操作以及操作次数的不同,会产生非常多的情况,如果考虑何时使用操作,情况更是多。如果将在图上求解最短路看成是在二维平面上进行的,引入进行操作的次数 k 做为第三维,那么这个三维空间就理应可以包含所有的情况,便可以在这个三维空间上解决问题。
每进行一次操作(k+1),除了操作的边,其他边没有任何变化,在 k=0,1,2,…,时图都是一样的,那么就将图复制成 k+1 份,第 i 层图代表进行了 i 次操作后的图。
每相邻两层图之间的联系,应该决定了一次操作是发生在哪条边上(何时进行操作)。根据操作的特点(对边权的修改)可以 i 层点到 i+1 层点的边来表示一次操作。
例题也非常多,这里举几个例子。
魔法(本题分层图写并不能拿满分)
经典使用场景
我们对一个图上从起点到终点的多条最短路进行操作。
又比如网络流中Dinic算法的优化,我们就是跑出分层图,接着同时对多条路径进行操作。
区别与联系
最后,我们总结一下,这两个知识点的区别于联系。
联系
我们可以发现,拆点就是分层图的实现逻辑,其实两者是一个思想。都是一个点的状态表示不够了,我们对点进行的拆分。我们可以说分层图是拆点的一种实现。
区别
我们说拆点与分层图的最大不同,可能就是添加的状态的形式。
对于拆点而言,添加的状态一般都是具体的,比如方向,数量等。其转移时,并不是说一定会向下一层转移。比如,进来的方向是左,出必须向右或向下,其并没有具体的下一层。或者是,当前拥有的数量为c,而进入当前格子后会+d个数量,则就不是转移到+1的下一层。因此其状态要不没有具体的下一层,要不就其转移就不是随着层数递增而进行的。
而对于分层图而言,其新添加的状态就是,例如某些具体的对边的操作数,最短路上的相邻点与点之间的分层,随着状态的增加,其所有的转移都是在相邻的层与层之间进行的。其转移就是随着状态层数递增而进行的。

浙公网安备 33010602011771号