边权为正,求最短路,但全程至多把一条已有通道的费用改成 0。直接把某条边改成 0 再跑 Dijkstra,要对每条边做一次,最大数据过不了。
关键观察:最优路线要么不用协议,要么恰好免费走一条通道 (u,v)。后一种情况,路线被拆成三段:s 走到 u(全部按原价)、免费穿过这条通道、v 走到 t(全部按原价)。两头都是普通最短路。
勘探队要从入口走到出口。洞穴有 n 个洞室,编号 1∼n,以及 m 条双向通道。每条通道连接两个洞室。沿一条长度为 w 的通道走,路程增加 w。同一条通道、同一个洞室都可以多次经过。
队伍带了一次应急协议:全程至多可以把一条通道的通行路程记为 0(走这条通道时不再累加它的长度)。也可以不用这次协议。协议不能凭空造出新通道,只能用在已经存在的通道上,且整段行程里最多用一次。
入口在洞室 s,出口在洞室 t。请给出最短总路程。无法到达时输出 −1。
第一行四个整数 n、m、s、t。
接下来 m 行,每行三个整数 u、v、w,表示洞室 u 与 v 之间有一条长度为 w 的双向通道。
1≤n≤8000
0≤m≤2×104
1≤s,t,u,v≤n
1≤w≤106
允许重边和自环
输出一个整数:最短总路程;无法到达则输出 −1。
输入
4 4 1 4
1 2 5
2 4 5
1 3 100
3 4 1
输出
1
说明
不用协议时,走 1→2→4,路程 10。若把 1→3 这条看起来很长的通道免费走掉,再走 3→4,路程 1。只在原来的最短路上挑一条免费,得不到这个答案。
输入
3 1 1 3
1 2 5
输出
-1
说明
洞室 3 与入口不连通,应急协议也不能造出新通道。
In following contests:
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册