본문 바로가기
알고리즘 풀기

[백준] 1238 파티 python3

by 쏘야.yap 2020. 3. 13.
728x90

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

 

1238번: 파티

문제 N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다. 어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다. 각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다. 이 도로들은 단방향이기 때

www.acmicpc.net

 

코드

import heapq
from sys import stdin
input = stdin.readline
INF = float("inf")


def dijkstra(start, end):
    dist = [INF for _ in range(N+1)]
    dist[start] = 0

    q = []
    heapq.heappush(q, (0, start))

    while q:
        time, village = heapq.heappop(q)

        for ntime, nviliage in graph[village]:
            ntime += time
            if dist[nviliage] > ntime:
                dist[nviliage] = ntime
                heapq.heappush(q, (ntime, nviliage))

    return dist

N, M, X = map(int, input().split(" "))
graph = [[] for _ in range(N+1)]
for i in range(M):
    v, u, t = map(int, input().split(" "))
    graph[v].append((t, u))

# 파티 장소로 가기
max_time = -1
transfer_times = [[0] for _ in range(N+1)]
for i in range(1, N+1):
    if i == X:
        continue
    transfer_times[i] = dijkstra(i, X)[X]

comeback_times = dijkstra(X, None)
# 집으로 돌아가기
for i in range(1, N+1):
    if i == X:
        continue
    transfer_times[i] += comeback_times[i]
    max_time = max(transfer_times[i], max_time)

print(max_time)

 

해설

다익스트라를 두 번 돌려서 푸는 문제이다.

기존에 다익스트라를 풀던대로 그래프를 dict로 하고 다음 탐색대상 노드를 따로 찾으며 했더니 시간초과가 계속 걸렸다.

힙을 활용해서 우선순위큐로 풀면 시간이 훨씬 단축되는 듯 하다.

 

'알고리즘 풀기' 카테고리의 다른 글

[백준] 6603 로또 python3  (0) 2020.03.14
[백준] 15649 N과 M python3  (0) 2020.03.14
[백준] 3055 탈출 python3  (0) 2020.03.12
[백준] 2667 단지번호붙이기 python3  (0) 2020.03.10