문제 설명
문제
N(2 ≤ N ≤ 10,000)개의 섬으로 이루어진 나라가 있다. 이들 중 몇 개의 섬 사이에는 다리가 설치되어 있어서 차들이 다닐 수 있다.
영식 중공업에서는 두 개의 섬에 공장을 세워 두고 물품을 생산하는 일을 하고 있다. 물품을 생산하다 보면 공장에서 다른 공장으로 생산 중이던 물품을 수송해야 할 일이 생기곤 한다. 그런데 각각의 다리마다 중량제한이 있기 때문에 무턱대고 물품을 옮길 순 없다. 만약 중량제한을 초과하는 양의 물품이 다리를 지나게 되면 다리가 무너지게 된다.
한 번의 이동에서 옮길 수 있는 물품들의 중량의 최댓값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리가 존재한다는 의미이다. 서로 같은 두 섬 사이에 여러 개의 다리가 있을 수도 있으며, 모든 다리는 양방향이다. 마지막 줄에는 공장이 위치해 있는 섬의 번호를 나타내는 서로 다른 두 정수가 주어진다. 공장이 있는 두 섬을 연결하는 경로는 항상 존재하는 데이터만 입력으로 주어진다.
출력
첫째 줄에 답을 출력한다.
풀이 과정
- 다익스트라 알고리즘을 다르게 적용하여서 풀이함.
- 최소 비용 -> 최대 비용
기본적으로 다익스트라 알고리즘 사용
- 연결된 노드들 중에서 중량이 최댓값인 노드 선택
- 해당 노드에 연결된 인접 노드들의 중량 갱신 / 히프에 추가
기존에는 그냥 deque를 사용하였으나.. 시간 초과 문제가 생김.
- 최대 히프 사용하여 중량이 가장 큰 노드부터 방문
- 이미 갱신된 경우, 생략하는 과정 추가
목표 지점의 중량 출력
소스 코드
import sys
from collections import deque
import heapq
input = sys.stdin.readline
N, M = map(int, input().rstrip().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b, weight = map(int, input().rstrip().split())
graph[a].append([b, weight])
graph[b].append([a, weight])
start, end = map(int, input().rstrip().split())
INT_MAX = int(10e9)
distance = [0] * (N+1)
heap = [[-INT_MAX, start]]
distance[start] = INT_MAX
while heap:
cost, node = heapq.heappop(heap)
cost = -cost
# 이미 갱신된 경우라면 생략
if distance[node] > cost:
continue
for next_node, next_cost in graph[node]:
new_cost = min(cost, next_cost)
# 기존 무게보다 현재 거쳤을때의 무게가 더 크다면 갱신
if distance[next_node] < new_cost:
distance[next_node] = new_cost
heapq.heappush(heap, [-new_cost, next_node])
print(distance[end])
'알고리즘[Python] > 백준 알고리즘' 카테고리의 다른 글
[ 3613 ] [ String ] Java vs C++ (0) | 2021.08.21 |
---|---|
[ String ] 짧은 문제 (0) | 2021.08.21 |
[ 4195 ] [ Union-find ] 친구 네트워크 (0) | 2021.08.18 |
[ 2512 ] [ 이분 탐색 ] 예산 (0) | 2021.08.18 |
[ 16562 ] [ BFS ] 친구비 (0) | 2021.08.17 |