문제 상황
그리디 알고리즘으로 분류됨
매 상황에서 가장 비용이 적은 노드를 선택해서 임의의 과정을 반복
동작 단계
힙(Heap) 자료구조 이용
import heapq
heapq.heappush(myHeap, value)
heapq.heappop(myHeap)
import heapq
import sys
def dijkstra(start):
distance = [INF] * (V+1)
q = [] # 우선순위 큐
# 현재 노드의 이웃들이 거리가 짧은 순으로 우선순위가 높게 담겨있음
distance[start] = 0 # 시작점은 최단거리 0
heapq.heappush(q, (0, start))
while q:
# 큐에서 가장 최단거리가 짧은 노드 꺼내기
dist, now = heapq.heappop(q)
# 현재 노드가 이미 처리된 적이 있는 노드라면(더 짧은 최단거리가 이미 구해졌다면) 무시
if distance[now] < dist:
continue
# 현재 노드와 연결된 다른 인접한 노드들을 확인
for next in graph[now]:
cost = dist + next[1]
# 현재 노드를 거쳐서, 다음 노드로 이동하는 거리가 더 짧은 경우
if cost < distance[next[0]]:
distance[next[0]] = cost # 거리테이블 업데이트
heapq.heappush(q, (cost, next[0]))
return distance
input = sys.stdin.readline
INF = int(1e9) # 무한값(10억)
V, E, X= map(int, input().split())
graph = [[] for _ in range(V+1)]
# 모든 엣지값 입력받기
for _ in range(E):
u, v, w = map(int, input().split())
# u에서 v로 가는 가중치 w인 간선이 존재
graph[u].append((v, w))
max_dist = 0
for i in range(1 ,V+1):
# 다익스트라 i -> x
d_0 = dijkstra(i)[X]
# 다익스트라 x -> i
d_1 = dijkstra(X)[i]
max_dist = max(max_dist, d_0 + d_1)
print(max_dist)