https://www.acmicpc.net/problem/1238
다익스트라 알고리즘을 이용하여 최단거리로 X번 마을을 반환점으로 하여 왕복했을 때
가장 많은 시간을 소비하는 학생을 구하는 문제.
N이 1000이기 때문에 N^3인 플로이드워셜은 사용할 수 없을 것이라 판단하였다.
heapq를 이용한 다익스트라 알고리즘을 N번 돌려서 모든 출발점으로부터 X까지의 최단 경로를 구하였고,
X번 마을에서 다른 마을들까지의 최단거리 테이블을 따로 저장해 두었다가
두 리스트를 합쳤을때 원소의 최댓값을 구해주었다.
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
n, m, x = map(int, input().split())
graph = [[] for _ in range(n + 1)]
distance = [INF] * (n + 1)
res = [0]
res2 = []
def dijkstra(start):
global res2
q = []
distance = [INF] * (n + 1)
distance[start] = 0
heapq.heappush(q, (0, start))
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
if start == x:
res2 = distance
res.append(distance[x])
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append((b, c))
for i in range(1, n + 1):
dijkstra(i)
ans = list(map(sum, zip(res, res2)))
print(max(ans[1:]))
'Algorithm | SQL > BOJ' 카테고리의 다른 글
[BOJ 1194] 달이 차오른다, 가자 (Python) (0) | 2021.04.21 |
---|