For Programmer
백준 1238번 파이썬 문제풀이(파티) 본문
728x90
단순히 해당 문제를 풀려면 우선 X지점부터 각지점까지의 최단거리를 다익스트라로 구하고 그 후에 반복문을 돌며 각 지점에서 X까지 다익스트라로 최단거리를 구해서 그 2개의 합의 최댓값을 구하면 된다.
그러나 해당문제를 다익스트라 2번으로 굉장히 빠르게 풀 수 있는 방법이 있다. 바로 "각 지점에서 X까지 다익스트라로 최단거리를 구해서" 이부분을 단순히 그래프를 처음 입력받을 때 간선을 반대로 저장해놓으면 한번의 다익스트라로 모든 최단거리를 구할 수 있다. 즉, 반대로 뒤집어진 그래프에서 X지점에서 각지점까지의 최단거리가 결국 "각 지점에서 X까지 다익스트라로 최단거리" 가 되는 것이다.
import heapq
import sys
input = sys.stdin.readline
def dijkstra(s, graph: list, distance: list):
q = []
heapq.heappush(q, (0, s))
distance[s] = 0
while q:
cost, cur = heapq.heappop(q)
if distance[cur] < cost:
continue
for nxt, nxt_cost in graph[cur]:
if distance[nxt] > nxt_cost + cost:
distance[nxt] = nxt_cost + cost
heapq.heappush(q, (distance[nxt], nxt))
N, M, X = map(int, input().split())
graph = [[] for _ in range(N + 1)]
graph_r = [[] for _ in range(N + 1)]
for _ in range(M):
a, b, cost = map(int, input().split())
graph[a].append((b, cost))
graph_r[b].append((a, cost))
distance_r = [1e10] * (N + 1)
dijkstra(X, graph_r, distance_r)
distance = [1e10] * (N + 1)
dijkstra(X, graph, distance)
ans = 0
for i in range(1, N + 1):
ans = max(ans, distance[i] + distance_r[i])
print(ans)
728x90
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 1504번 파이썬 문제풀이(특정한 최단 경로) (0) | 2022.04.20 |
---|---|
백준 1753번 파이썬 문제풀이(최단 경로) (0) | 2022.04.20 |
백준 2636번 파이썬 문제풀이(치즈) - (bfs + 구현 or 다익스트라) (0) | 2022.04.19 |
백준 9328번 파이썬 문제풀이(열쇠 ) - (bfs + 구현) (0) | 2022.04.18 |
백준 2098번 파이썬 문제풀이(외판원 순회 ) - (dfs + 비트마스킹 + dp) (0) | 2022.04.17 |
Comments