▶1238 - 파티
▶문제
N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.
어느 날 이 N명의 학생이 X (1 ≤ X ≤ N) 번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.
각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.
이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.
▶입력
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어온다. 시작점과 끝점이 같은 도로는 없으며, 시작점과 한 도시 A에서 다른 도시 B로 가는 도로의 개수는 최대 1개이다.
모든 학생들은 집에서 X에 갈 수 있고, X에서 집으로 돌아올 수 있는 데이터만 입력으로 주어진다.
▶출력
첫 번째 줄에 N명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.
▶풀이
기말 공부하는 중 dijkstra가 있길래 백준에서 한 문제 찾아서 풀어보았다.
이 문제는 간단한 다익스트라 문제였다.
왔다 갔다 최대인 거리를 구하면 된다. (단방향)
돌아오는 다익스트라를 come_dij에 저장하고
1부터 n까지 가는 다익스트라를 반복문으로 구해서
come_dij (a)에서 i로 오는 거리, go_dij (i)에서 a로 가는 거리 중 최대인 아이를 Max에 저장하고 출력했다.
가장 기본적인 다익스트라 문제라고 생각이 든다.
근데 이렇게 반복문으로 하는 게 시간 복잡도가 괜찮은가라는 의문이 들었지만
일단은 통과하였기 때문에 그 고민은 접어두어야겠다.
import sys
import heapq
def dijkstra(start):
dist = {node: sys.maxsize for node in graph}
dist[start] = 0
queue = []
heapq.heappush(queue, (dist[start], start))
while queue:
cur_dist, node = heapq.heappop(queue)
if dist[node] < cur_dist:
continue
for ad_node, d in graph[node].items():
distance = d + cur_dist
if dist[ad_node] > distance:
dist[ad_node] = distance
heapq.heappush(queue, (distance, ad_node))
return dist
n, m, a = map(int, input().split())
graph = {}
for i in range(n):
graph[i + 1] = {}
for i in range(m):
x, y, d = map(int, input().split())
graph[x][y] = d
Max = 0
come_dij = dijkstra(a)
for i in range(n):
if i+1 == a:
continue
go_dij = dijkstra(i + 1)
if Max < go_dij[a] + come_dij[i + 1]:
Max = go_dij[a] + come_dij[i + 1]
print(Max)
'BOJ Code > Gold' 카테고리의 다른 글
[백준/BOJ] gold2 - 1256번 사전 (Python) (0) | 2022.06.22 |
---|---|
[백준/BOJ] gold5 - 2293번 동전 1 (Python) (0) | 2022.06.19 |
[백준/BOJ] gold3 - 1937번 욕심쟁이 판다문제 (Python) (0) | 2022.06.14 |
[백준/BOJ] gold3 - 11054번 가장 긴 바이토닉 부분 수열 (Python) (0) | 2022.06.14 |
[백준/BOJ] gold4 - 9663번 N-Queen (Python) (0) | 2022.06.10 |