import heapq def dijkstra(s, e): dist = [float('inf') for _ in range(n+1)] # 경로 시간 초기화 queue = [] heapq.heappush(queue, [0, s]) # 시작 지점 넣어주기 dist[s] = 0 # 시작지점의 길이 0으로 설정 (시작 -> 시작 의 시간은 0) while queue: d, now = heapq.heappop(queue) # 현재까지의 시간과 현재 마을 꺼내기 if now == e: # 도착지점이면 시작 -> 현재 마을까지 최단 거리 return return d # 학생 마을 -> x 로 갈때만 해당 if dist[now] < d: # 현재 마을까지 걸리는 저장된 시간보다 꺼낸 시간이 더 크다면 pass continue for next in visited[now]: # 현재 마을에서 갈 수 있는 곳들 방문 nd = next[1] + d # 시간 더하기 if nd < dist[next[0]]: # 저장되어있는 시간보다 더 작다면 (더 최단경로가 있다면) dist[next[0]] = nd # 갱신 heapq.heappush(queue, [nd, next[0]]) # 그 마을 가기 return dist # x에서 각 마을로 돌아갈때 시간 list로 리턴 n, m, x = map(int, input().split()) # n명 학생, m개의 단방향 도로, x 마을 (파티지점) visited = [[] for _ in range(n+1)] # 연결되어 있는 마을 만들기 (인접리스트) for _ in range(m): s, e, t = map(int, input().split()) # 도로 시작점 s, 끝점 e, 필요한 소요시간 t visited[s].append([e, t]) # 단방향 x_to_s = dijkstra(x, 0) # 에서 각 학생들의 마을까지 최단시간 구하기 answer = 0 for i in range(1, n+1): distance = dijkstra(i, x) + x_to_s[i] # 왕복 길이 answer = max(answer, distance) # 오래 걸리는 학생의 소요시간 갱신 print(answer)
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 9252. LCS2 (0) | 2022.01.01 |
---|---|
[Python] 11723. 집합 (0) | 2022.01.01 |
[Python] 1504. 특정한 최단 경로 (0) | 2021.12.16 |
[Python] 1244. 스위치 켜고 끄기 (0) | 2021.12.16 |
[Python] 10026. 적록색약 (0) | 2021.12.16 |