1
+ import sys
2
+ import heapq as hq
3
+ input = sys .stdin .readline
4
+
5
+ """
6
+ [특정한 최단 경로]
7
+
8
+ 가능한 경로
9
+ 1. 1 -> v1 -> v2 -> n
10
+ 2. 1 -> v2 -> v1 -> n
11
+ -> 1, v1, v2를 시작점으로 하는 다익스트라 함수 실행하기
12
+
13
+ !주의!
14
+ 한 번 이동했던 정점, 간선을 다시 방문할 수 있음. 즉 1->N의 최댓값이 INF(1e5*8)이 아니라 3*INF!
15
+ """
16
+
17
+ INF = 8 * (10 ** 5 ) * 3 # 최대 N-1개의 간선을 지나게 됨 * 중복 순회 가능(3)
18
+
19
+ def dijkstra (n , graph , start ):
20
+ dist = [INF ]* (n + 1 )
21
+ pq = [(0 , start )]
22
+
23
+ dist [start ] = 0
24
+
25
+ while pq :
26
+ weight , curr = hq .heappop (pq )
27
+ if weight > dist [curr ]:
28
+ continue
29
+ for next , next_weight in graph [curr ]:
30
+ new_weight = next_weight + weight
31
+ if new_weight < dist [next ]:
32
+ dist [next ] = new_weight
33
+ hq .heappush (pq , (new_weight , next ))
34
+
35
+ return dist
36
+
37
+
38
+ n , e = map (int , input ().split ())
39
+ graph = [[] for _ in range (n + 1 )]
40
+
41
+ for _ in range (e ):
42
+ a , b , c = map (int , input ().split ())
43
+ graph [a ].append ((b , c ))
44
+ graph [b ].append ((a , c ))
45
+
46
+ v1 , v2 = map (int , input ().split ())
47
+
48
+ dist = []
49
+ for s in (1 , v1 , v2 ):
50
+ dist .append (dijkstra (n , graph , s ))
51
+
52
+ # 1->v1->v2->n의 경로와 1->v2->v1->n의 경로 중 최솟값
53
+ # 무방향 그래프기 때문에 v1->v2와 v2->v1은 사실 같은 값!
54
+ ans = min (dist [0 ][v1 ] + dist [1 ][v2 ] + dist [2 ][n ], dist [0 ][v2 ] + dist [2 ][v1 ] + dist [1 ][n ])
55
+
56
+ if ans >= INF :
57
+ print (- 1 )
58
+ else :
59
+ print (ans )
0 commit comments