BOJ 1238 파티
https://www.acmicpc.net/problem/1238
시간 1초, 메모리 128MB
input :
- N M X (1 ≤ X <= N ≤ 1,000)(1 ≤ M ≤ 10,000)
- u v c (1 <= c <= 100)
output :
- 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력
조건 :
-
시작점과 한 도시 A에서 다른 도시 B로 가는 도로의 개수는 최대 1개
-
이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.
-
이 도로들은 단방향
문제를 제대로 안 읽어 가는 경우만 따졌다. 그것도 그렇고 모든 마을에서 X로 가는 것을 계산하는 것보다 더 나은 방도를 찾아야 했다.
다음 풀이
- 오고 가는데에
- 요구하는 도착지 X
X로 가고, X에서 오는 것을 따져야 한다.
다익스트라를 사용하여 최단 거리를 구하라는 의미
X로 가고, X에서 오는 것을 따져야 한다.
다익스트라를 사용하여 최단 거리를 구하라는 의미
원래의 방향으로는 X에서 다른 마을로 돌아가는 모든 경우를 계산할 수 있다.
간선의 방향을 뒤집은 경우, 해당 마을 -> X로 가는 모든 경우를 계산할 수 있다. 물론 X에서 다른 마을로 가는 경우의 값을 계산한 것이 동일한 결과를 가진다.
그래서 2번 다익스트라를 수행하고 해당하는 배열을 합한 후에 최댓값을 찾으면 된다.
import sys
from heapq import heappop, heappush
def dijkstra(graph):
q = []
heappush(q, (0, x))
dist = [float("inf")] * (n + 1)
dist[x] = 0
while q:
cost, node = heappop(q)
if cost > dist[node]:
continue
for next_cost, next_node in graph[node]:
temp = next_cost + cost
if dist[next_node] > temp:
dist[next_node] = temp
heappush(q, (temp, next_node))
return dist
n, m, x = map(int, sys.stdin.readline().split())
original, reverse = [[] for _ in range(n + 1)], [[] for _ in range(n + 1)]
for _ in range(m):
u, v, c = map(int, sys.stdin.readline().split())
original[u].append((c, v))
reverse[v].append((c, u))
ori_dist = dijkstra(original)
rev_dist = dijkstra(reverse)
for i in range(n + 1):
ori_dist[i] += rev_dist[i]
print(max(ori_dist[1:]))
Author And Source
이 문제에 관하여(BOJ 1238 파티), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jsin2475/BOJ-1238-파티저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)