본문 바로가기
Problem Solving/BOJ

[BOJ][Python]1238 풀이

by NoiB 2023. 8. 2.
반응형

https://www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

import heapq
import sys
ssr = sys.stdin.readline

INF = 1000001

def dijkstra(start, edges):
    time = [INF for _ in range(n+1)]
    time[start] = 0
    h = [(0, start)]
    while h:
        cur_time, cur_node = heapq.heappop(h)
        if cur_time > time[cur_node]:
            continue
        for next_time, next_node in edges[cur_node]:
            cost = time[cur_node] + next_time
            if cost < time[next_node]:
                time[next_node] = cost
                heapq.heappush(h, (time[next_node], next_node))
    return time

n, m, x = map(int, ssr().split())
routes = [[] for _ in range(n+1)]
reverse_routes = [[] for _ in range(n+1)]
for _ in range(m):
    departure, arrival, time = map(int, ssr().split())
    routes[departure].append((time, arrival))
    reverse_routes[arrival].append((time, departure))
time_take = [0 for _ in range(n+1)]
time_take = dijkstra(x, routes)
reversed_time_take = dijkstra(x, reverse_routes)
max_time = 0
for i in range(1, n+1):
    max_time = max(max_time, time_take[i]+reversed_time_take[i])
print(max_time)

문제가 어려운 것 보다는 아이디어가 좀 더 중요한 문제라고 생각합니다. 문제에서 시키는대로 할 경우 처음에 각 노드에서 x까지가는 최단 거리를 구하기 위해서 노드의 갯수만큼 데이크스트라를 실행해야하고, 상당히 시간이 걸리게 됩니다. O(mlogn)을 n-1번 반복해야해요. 저도 처음에는 이렇게 풀어서 통과는 했는데 런타임 차이가 많이 나서 보니까 입력받은 그래프를 뒤집는 코드를 다들 사용하셨더라구요. 처음에는 코드를 대충보고 엥 말도 안되지 않나하고 생각했습니다.

 

해당 방법에서의 아이디어는 '기존의 입력을 사용할 때 각 노드에서 x까지가는 최단 거리'가 '간선의 출발점과 도착점을 뒤집어서 사용할 때 x에서 각 노드까지 가는 최단거리'가 같은 결과를 낸다는 부분을 사용한 것입니다. 데이크스트라는 출발점에서 다른 노드에 가는 각각의 최단거리를 알기 용이한 알고리즘이기에 시키는대로 할 경우에 모든 시작노드마다 각각 데이크스트라를 사용해야 하는 것을 한 번으로 가능하게 한 것이죠. 이런 아이디어가 떠올랐다면 그냥 평범한 데이크스트라 2번 반복입니다.

 

데이크스트라에 대해 좀 더 궁금하시다면,

[Algorithm][Python]데이크스트라(Dijkstra) 최단 경로 알고리즘 + 코드

 

[Algorithm][Python]데이크스트라(Dijkstra) 최단 경로 알고리즘 + 코드

저를 가장 오랫동안 괴롭혔던 알고리즘 중에 하나인 데이크스트라 알고리즘에 대해서 정리를 해볼까합니다. 그 때의 헤매던 저와 비슷한 분들께 도움이 되면 좋겠네요. 데이크스트라(Dijkstra) 최

justduke.tistory.com

 

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]11657 풀이  (0) 2023.08.05
[BOJ][Python]9370 풀이  (0) 2023.08.03
[BOJ][Python]13549 풀이  (0) 2023.08.01
[BOJ][Python]1504 풀이  (0) 2023.08.01