题目链接:Luogu P4568 [JLOI2011] 飞行路线
题目描述:
给定一张带权无向图,以及起点
s
和终点t
,可以选择将最多k
条边的权值变为0
,问s
到t
的最短路径。
题解:
只需要在求单源最短路的时候增加一个状态
j
表示当前将几条边边权变成了0
,通过将距离数组变成二维,dis[i][j]
表示s
到i
将j
条边边权变为0
后的最短路。
以s
为起点进行Dijkstra
,对于当前正在遍历的状态(u, j)
设与其相连的一个结点为v
边权为w
,则可以得到:dis[v][j] = min(dis[u][j] + w)
表示不将w
变成0
此时新的状态为(v, j)
;若j<k
则表明还可以将边变为0
,此时还有一种更新方式,即dis[v][j+1] = min(dis[u][j])
此时新的状态为(v, j+1)
。
最终的答案只需要min(dis[t][j])
即可。
代码:LuoguP4568