-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbj1504.py
More file actions
60 lines (49 loc) · 1.41 KB
/
Copy pathbj1504.py
File metadata and controls
60 lines (49 loc) · 1.41 KB
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#특정한 최단 경로
import sys
from collections import deque
#https://www.acmicpc.net/board/view/85172 INF 설정하는 방법
INF = int(1e7)
n, e = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n+1)]
for _ in range(e):
a, b, c = map(int, sys.stdin.readline().split())
graph[a].append((b,c))
graph[b].append((a,c))
#경유지
v1, v2 = map(int, sys.stdin.readline().split())
# 끊긴 경로가 없는지 검사
def bfs():
visited = [False] * (n+1)
q = deque()
q.append(1)
visited[1] = True
while q:
v = q.popleft()
for i, d in graph[v]:
if not(visited[i]):
q.append(i)
visited[i] = True
if visited[v1] and visited[v2] and visited[n]:
return True
else:
return False
def dijkstra(start):
dist = [INF] * (n+1)
visited = [False] * (n+1)
dist[start] = 0
#visited[start] = True
for _ in range(n):
v = min(list(range(1,n+1)), key = lambda x: dist[x] if not(visited[x]) else INF)
visited[v] = True
for i, d in graph[v]:
dist[i] = min(dist[i], dist[v] + d)
return dist
# 1 -> v1, v1 -> v2, v2 -> n
# 1 -> v2, v2 -> v1, v1 -> n
if bfs():
dist_1 = dijkstra(1)
dist_v1 = dijkstra(v1)
dist_v2 = dijkstra(v2)
print(min(dist_1[v1] + dist_v1[v2] + dist_v2[n], dist_1[v2] + dist_v2[v1] + dist_v1[n]))
else:
print(-1)