티스토리 뷰

728x90

https://www.acmicpc.net/problem/1504

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import heapq, sys
 
 
def dijkstra(start):
    hq = []
    dp = [INF] * (N + 1)
    dp[start] = 0
    heapq.heappush(hq, [start, 0])
    while hq:
        route, cost = heapq.heappop(hq)
        if dp[route] < cost:
            continue
        for new_route, new_cost in lst[route]:
            best_cost = cost + new_cost
            if dp[new_route] > best_cost:
                dp[new_route] = best_cost
                heapq.heappush(hq, [new_route, best_cost])
    return dp
 
 
std = sys.stdin
N, E = map(int, std.readline().split())
INF = sys.maxsize
 
lst = [[] for _ in range(N + 1)]
for _ in range(E):
    a, b, c = map(int, std.readline().split())
    lst[a].append([b, c])
    lst[b].append([a, c])
v1, v2 = map(int, std.readline().split())
tmp = dijkstra(1)
v1_ = dijkstra(v1)
v2_ = dijkstra(v2)
res = min(tmp[v1] + v1_[v2] + v2_[N], tmp[v2] + v2_[v1] + v1_[N])
print(res if res < INF else -1)
cs

 

댓글