# 파티
import sys
import heapq
input = sys.stdin.readline
MAX = sys.maxsize
N, M, X = map(int, input().split())
arr = [[] for _ in range(N+1)]
for _ in range(M):
a, b, cost = map(int, input().split())
arr[a].append((cost, b))
come = [MAX] * (N+1)
go = [MAX] * (N+1)
def go_dijkstra(x):
q = []
heapq.heappush(q, (0, x))
go[x] = 0
while q:
cost, node = heapq.heappop(q)
for ncost, nnode in arr[node]:
if go[nnode] > ncost + go[node]:
go[nnode] = ncost + go[node]
heapq.heappush(q, (ncost, nnode))
def come_dijkstra(x):
temp = [MAX] * (N+1)
q = []
heapq.heappush(q, (0, x))
temp[x] = 0
while q:
cost, node = heapq.heappop(q)
for ncost, nnode in arr[node]:
if temp[nnode] > ncost + temp[node]:
temp[nnode] = ncost + temp[node]
heapq.heappush(q, (ncost, nnode))
return temp[X]
go_dijkstra(X)
for i in range(1, N+1):
come[i] = come_dijkstra(i)
result = [0] * (N+1)
for i in range(1, N+1):
result[i] = come[i]+go[i]
print(max(result))
최단거리, 다익스트라
1. 목표지점(X)에서 각 노드로 가는 최단거리를 go리스트에 저장 (go_dijkstra 함수)
2. 각 노드에서 목표지점(X)로 오는 최단거리를 come리스트에 저장 (come_dijkstra 함수를 노드수만큼 실행해서)
3. go와 come의 합을 result에 저장하고 max(result)출력
방향 그래프의 최단거리이다. 그래서 다익스트라 알고리즘으로 올 때 와 갈 때의 경우 두가지로 나눠서 계산했다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 1655번 - 가운데를 말해요 (파이썬) (0) | 2022.01.26 |
---|---|
[백준] 2573번 - 빙산 (파이썬) (0) | 2022.01.25 |
[백준] 12100번 - 2048(Easy) (파이썬) (0) | 2022.01.25 |
[백준] 1707번 - 이분 그래프 (파이썬) (0) | 2022.01.25 |
[백준] 2252번 - 줄 세우기 (파이썬) (0) | 2022.01.24 |