题意简述
一个有$n$个点的图有$m$条地铁线,每条线路$i$乘坐需要花费$a_i$,每坐一站需要多花费$b_i$,每条线路有$c_i$个站点按顺序连过,每个线路都是双向边。现在从$s$到$t$中间可以多次换乘,问最少花费,如不可到达则输出-1
$1≤n≤10 ^3,1≤m≤500,1≤s,t≤n$ $1\leq a_i,b_i\leq 100,1\leq c_i\leq n,\sum_{i=1}^m{c_i}\leq 10^5$
样例
输入
5 2 1 4
2 2 3 1 3 5
2 1 4 2 3 4 5
输出
7
题解
好久没写题解了呜呜
这道题假如按照常规思路去做的很多细节其实蛮难处理的,但是假如采取分层图的思想去做就会清晰很多,所以就记录一下分层图的这种做法
首先我们需要对每个地铁都建一层图,每层图都有$n$个点,所以一共有$n\cdot m$个点,最后把原始的图也就是原本的$n$个节点作为第$m+1$层图,下面我们考虑一下怎么连边
每一层的地铁还是比较好想的,对于一条线路每两个站点都连边权为$b_i$的双向边,之后就是重点,对于当前层的每一个点,我们向第$m+1$层的对应的点连一条边权为$0$的单向边,然后反向连一条边权为$a$的单向边
这一步是在干什么呢?我们把第$m+1$层的图看成主体,这样在这层的每个点,我们就能获取到所有的乘车情况,因为地铁每个线路的对应点都与它相连,由于这是换乘,所以需要花费$a_i$,这就是从$m+1$层往其他层连需要$a_i$花费的原因
换乘之后我们会在这层铁路正常行驶,假如有再次换乘的话,其实就是对应回到第$m+1$层之后选择所有可以换乘的线路,所以题目所有的要求都被我们满足了,在这个分层图上我们从第$m+1$层的$s$节点跑一边最短路,第$m+1$层的$t$节点的最短路就是答案
AC代码
|
|