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 |