[파이썬] 백준 1162 : 도로포장 (플레5)
1162번: 도로포장
첫 줄에는 도시의 수 N(1 ≤ N ≤ 10,000)과 도로의 수 M(1 ≤ M ≤ 50,000)과 포장할 도로의 수 K(1 ≤ K ≤ 20)가 공백으로 구분되어 주어진다. M개의 줄에 대해 도로가 연결하는 두 도시와 도로를 통과하
www.acmicpc.net
문제
풀이
0. 방향성 생각
- 상태 나누기 + 다익스트라
- 벽뿌 시리즈에서 벽을 부순 횟수로 상태 나눈 것 처럼, 도로를 포장한 횟수를 힙에 추가적으로 넣어서 풀이.
- 태그에 DP가 달려있긴 한데 기본적인 발상이 다익이랑 똑같다.
1. 입력
import heapq as hq
import sys
input = lambda : sys.stdin.readline().rstrip()
n,m,k = map(int,input().split())
graph = [[] for _ in range(n+1)]
for _ in range(m):
a,b,cost = map(int,input().split())
graph[a].append((b,cost))
graph[b].append((a,cost))
visit = [[float('inf')]*(n+1) for _ in range(k+1)]
visit[0][1] = 0
heap = [(0,0,1)]
while heap:
t,skill,x = hq.heappop(heap)
if x == n:
print(t)
break
if t > visit[skill][x]:
continue
for nx,cost in graph[x]:
nt = t + cost
if skill < k and t < visit[skill+1][nx]:
visit[skill+1][nx] = t
hq.heappush(heap,(t,skill+1,nx))
if nt < visit[skill][nx]:
visit[skill][nx] = nt
hq.heappush(heap,(nt,skill,nx))
- 힙에 (누적 비용, 포장 횟수, 노드)를 넣는다.
- 도착점에 도착했으면 누적비용 출력
- 더미큐 빼주는 코드 추가 (시간초과 방지)
- 도로를 포장할 수 있는 횟수가 남았을 때, 값을 갱신하면 힙에 추가.
- 도로를 포장 안하고 갱신할 수 있으면 힙에 추가.
- if / if문이다. 포장 하는 경우, 안 하는 경우를 동시에 생각해야함.
코멘트
플레급은 아닌거같은데 흠... 더미큐 안빼주니까 시간초과했음. 더미큐 빼는거를 디폴트로 코드에 추가해야할듯
1e9 대신 inf 쓰니까 통과
'Algorithm > Graph' 카테고리의 다른 글
[파이썬] 백준 16954 : 움직이는 미로탈출 (골드3) (0) | 2024.02.19 |
---|---|
[파이썬] 백준 9347 : 울타리 (골드3) (0) | 2024.02.18 |
[파이썬] 백준 14466 : 소가 길을 건너간 이유 6 (골드 4) (0) | 2024.01.29 |
[파이썬] 백준 15806 : 영우의 기숙사 청소 (플레5) (0) | 2023.12.23 |
[파이썬] 백준 23034 : 조별과제 멈춰 (플레5) (0) | 2023.12.22 |
[파이썬] 백준 1944 : 복제 로봇 (골드1) (0) | 2023.12.19 |
[파이썬] 백준 1194: 달이 차오른다, 가자. (골드1) (0) | 2023.12.19 |
댓글