分层图
分层图主要就是通过将图分为几层,每层内部都有边,然后各层之间也有边,用于解决对边权进行操作且操作数少的题目。
Example
给一个无向图,求(1 o n)的最短路径,其中可以选择不超过(k)条边让边的边权变为一半。 (n le 50,m le 1000,k le 50)。
考虑建立(0,1,2,cdots,k)层共(k + 1)层图。定义(P(x,y))为第(y)层的点(x)。每层内部都按照原图连边,然后考虑边((u,v) in E),对于第(i)和(i + 1)层((i + 1 le k)),连无向边(P(u,i) o P(v,i + 1))和(P(v,i) o P(u,i + 1)),边权为(w / 2)。然后跑一遍最短路,答案为(min_{i = 0} ^ k {dis_{P(n,i)}}).
如果用pq优化的Dijkstra实现,时间复杂度为(mathcal{O}(mk + mk log{mk}))。
Problem
- P4822 [BJWC2012]冻结
就是上面的例子。 - P4568 [JLOI2011]飞行路线
一个套路。 - 某模拟赛题/某CF题
一个无向图,求(S o T)的最短路,一条路径的长度定义为路径上的边权和减去最大边权加上最小边权。
发现其实就是(sum_{w
eq w_{max},w
eq w_{min}} w + 2 cdot w_{max})
跑分层图即可。