practivceAlgorithm/swexpertacademy
[SWEA][Python] 1795 인수의 생일파티
findTheValue
2021. 10. 15. 13:07
가중치가 있는 단방향 그래프의 왕복 최단거리를 묻는 문제로 정방향, 역방향으로 다익스트라를 그려준 후 합치면
왕복 최단거리를 구할 수 있습니다.
(역방향 다익스트라는 돌아오는 경로에 대한 역탐색이기 때문)
from heapq import heappop, heappush
def dijkstra(graph, start):
dp_dists = {i: float('inf') for i in range(1, N + 1)}
dp_dists[start] = 0
heap = []
heappush(heap, (0, start))
while heap:
cur_dists, cur_node = heappop(heap)
for next_node, next_dist in graph[cur_node]:
dists = cur_dists + next_dist
if dp_dists[next_node] > dists:
dp_dists[next_node] = dists
heappush(heap, (dists, next_node))
return dp_dists
for test in range(1, int(input()) + 1):
N, M, X = map(int, input().split())
graph = {i: [] for i in range(1, N + 1)}
reverse_graph = {i: [] for i in range(1, N + 1)}
for _ in range(M):
x, y, c = map(int, input().split())
graph[x].append((y, c))
reverse_graph[y].append((x, c))
dist_set = dijkstra(graph, X)
re_dist_set = dijkstra(reverse_graph, X)
max_distance = 0
for i in range(1, N + 1):
max_distance = max(max_distance, dist_set[i] + re_dist_set[i])
print(f'#{test} {max_distance}')