728x90
11779번: 최소비용 구하기 2
첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스
www.acmicpc.net
🤔 문제분석
우선순위큐를 이용하여 문제를 해결하였는데요, 예전에 풀었던 유형이랑 비슷해서 문제를 쉽게 풀 수 있었습니다. 방문 경로를 구하는 로직은 거꾸로 우선순위큐를 역추적 하면됩니다. 말로는 어렵지만 코드를 보면 쉽게 이해 할 수 있습니다.
💻 코드
import sys
import heapq
input = sys.stdin.readline
INF = sys.maxsize
n = int(input())
m = int(input())
edge = [[] for _ in range(n+1)]
reverse_edge = [[] for _ in range(n+1)]
for _ in range(m):
s, e, cost = map(int, input().split())
edge[s].append((e, cost))
reverse_edge[e].append((s, cost))
start, end = map(int, input().split())
queue = []
dp = [INF for _ in range(n+1)]
heapq.heappush(queue, (start, 0))
while queue:
cur, cost = heapq.heappop(queue)
if cost > dp[cur]:
continue
dp[cur] = cost
for next, next_cost in edge[cur]:
new_cost = next_cost + cost
if dp[next] > new_cost:
dp[next] = new_cost
heapq.heappush(queue, (next, new_cost))
city = []
city.append(end)
cur = end
while cur != start:
for prev, cost in reverse_edge[cur]:
if dp[cur] == dp[prev] + cost:
city.append(prev)
cur = prev
break
print(dp[end])
print(len(city))
print(*reversed(city))
🎯 피드백 및 개선사항
다른사람들의 풀이를 보니 배열을 하나 만들고 이전에 방문했던 노드를 넣어두고 그 노드를 역추적 하여 문제를 해결 하신 분도 있어서 참고하였습니다~
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1613번 : 역사 (0) | 2024.03.10 |
---|---|
[백준] 4179번 : 불! (0) | 2024.03.10 |
[백준] 12851번 : 숨바꼭질 2 (1) | 2024.03.05 |
[백준] 1600번 : 말이 되고픈 원숭이 (1) | 2024.03.05 |
[백준] 20056번 : 마법사 상어와 파이어볼 (0) | 2024.03.03 |