-
[BOJ/python]1162번 도로포장알고리즘/BOJ 2022. 7. 6. 22:51
백준 1162번 도로포장 파이썬, 다익스트라
문제 링크 - https://www.acmicpc.net/problem/1162
주어진 도로에서 최대 K개의 도로의 가중치를 0으로 만들 수 있다. 조합을 사용할까 고민했다. 다익스트라를 이용하여 dist배열을 2차원으로 만들고 도로의 가중치를 0으로 만든 횟수를 저장했다.
1. 풀이
- heap에 현재까지 누적 가중치, 0으로 만든 도로의 수, 현재 노드를 넣어준다.
- 다음 노드를 방문할 때 heap에서 pop된 정보를 이용하여 최단 거리를 구한다.
- 다음 노드를 방문할 때 0으로 만든 도로의 수를 기준으로 방문 표시를 한다.
2. 코드
from heapq import heappop, heappush INF = float('inf') N,M,K = map(int, input().split()) G=[ [] for _ in range(N+1)] for _ in range(M): u,v,c = map(int,input().split()) G[u].append([v,c]) G[v].append([u,c]) def dijkstra(): dist=[ [INF for _ in range(K+1)] for _ in range(N+1)] visited=[[0 for _ in range(K+1)] for _ in range(N+1)] heap=[] dist[1] = [0 for _ in range(K+1)] heappush(heap, [0,0,1]) while heap: cum, deleted,node = heappop(heap) if visited[node][deleted]==1: continue visited[node][deleted]=1 for next, cost in G[node]: if visited[next][deleted]==1: continue if deleted<K : if dist[next][deleted+1] > cum: dist[next][deleted+1]=cum heappush(heap, [cum, deleted+1, next]) if deleted==0: if dist[next][deleted] > cum + cost: dist[next][deleted] =cum + cost heappush(heap, [dist[next][deleted], deleted, next]) else: if dist[next][deleted] > cum + cost or (dist[next][deleted] > dist[node][deleted-1]+0 ): if cum+ cost > dist[node][deleted-1] : dist[next][deleted] = dist[node][deleted-1] heappush(heap, [dist[next][deleted], deleted, next ]) else : dist[next][deleted] = cum + cost heappush(heap, [dist[next][deleted], deleted, next]) return dist result = dijkstra() print(min(result[N]))
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ/python]1182번 부분수열의 합 (0) 2022.07.06 [BOJ/python]10282번 해킹 (0) 2022.07.06 [BOJ/python]1261번 알고스팟 (0) 2022.07.06 [BOJ/python]11375번 열혈강호 (0) 2022.07.06 [BOJ/python]2213번 트리의 독립집합 (0) 2022.07.06