本题可以被转化为:首先花费一定代价从起点 1 到达某个全能补给站,之后再免费(通行费用为 0)走到终点 n。因此,最优路径的总费用等于从起点到某个补给站的最小费用,前提是该补给站能够通过后续的免费航线到达终点。
具体分为以下三步:
dist[u] 表示从起点 1 到星球 u 的最小通行费用总和。dist 值为无穷大。在星际物流网络中,有 n 个星球,编号从 1 到 n。星球之间有 m 条单向航线,每条航线都需要支付一定的通行费用。
你是一名快递员,需要从星球 1 出发,前往星球 n。网络中存在 k 个特殊的星球,这些星球上设有“全能补给站”。一旦你抵达任意一个全能补给站,你将获得一枚全免通行证。此后,无论经过哪条航线,都无需再支付任何费用。
为了节省开支,你必须至少经过一个全能补给站,然后前往目的地。请问,在满足条件的前提下,完成这次旅途所需的最小总费用是多少?
数据范围:
第一行包含三个整数 n,m,k,分别表示星球数、航线数和补给站数量。 接下来 k 行,每行一个整数,表示一个设有全能补给站的星球编号。保证这 k 个整数互不相同。 接下来 m 行,每行三个整数 ui,vi,wi,表示一条从星球 ui 到星球 vi 的航线,通行费用为 wi。
输出一行一个整数,表示从星球 1 到星球 n 且至少经过一个补给站的最小总费用。如果无法完成,输出 −1。
输入
4 4 2
2
3
1 2 5
2 3 3
3 4 2
1 4 10
输出
5
说明
从星球 1 出发,直接前往补给站 2 的最小花费为 5(边 1→2)。抵达补给站后获得全免通行证,后续路径全部免费,可经 2→3→4 免费到达终点。另一补给站 3 的最小到达花费为 8(1→2→3)。因此,在强制经过至少一个补给站的条件下,最小总费用为 5。
输入
4 3 1
3
1 2 1
2 3 2
1 4 100
输出
-1
说明
网络中唯一的补给站是星球 3。从起点 1 到补给站 3 的最小花费为 3(1→2→3)。但星球 3 没有通往终点 4 的航线(唯一的边 1→4 无法从 3 抵达),因此即使获得全免通行证也无法完成旅途,输出 −1。
输入
3 2 1
1
1 2 5
2 3 5
输出
0
说明
起点星球 1 本身即为全能补给站,出发时立即获得全免通行证。此后所有航线的费用均被免除,因此在满足「至少经过一个补给站」的前提下,总费用为 0。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.