백준 온라인 저지, 최단경로 / 1939번: 중량제한 (파이썬 / 백준 골드문제)
2021. 11. 14. 22:01ㆍ알고리즘/최단경로
728x90
반응형
문제
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인 다리가 존재한다는 의미이다. 서로 같은 두 섬 사이에 여러 개의 다리가 있을 수도 있으며, 모든 다리는 양방향이다. 마지막 줄에는 공장이 위치해 있는 섬의 번호를 나타내는 서로 다른 두 정수가 주어진다. 공장이 있는 두 섬을 연결하는 경로는 항상 존재하는 데이터만 입력으로 주어진다.
출력
첫째 줄에 답을 출력한다.
예제 입력 1
3 3 1 2 2 3 1 3 2 3 2 1 3
예제 출력 1
3
접근 방법
- 최대힙을 사용해서 최대 중량을 계산한 뒤, 이를 출력한다.
코드
# https://www.acmicpc.net/problem/1939
# 접근 방법
# 최대힙을 사용해서 최대 중량을 계산한 뒤, 이를 출력한다.
def move(a):
INF = int(1e9) + 1
q = []
heapq.heappush(q, [-INF, a])
weight[a] = INF
while q:
w, now = heapq.heappop(q)
if weight[now] > -w:
continue
for x in graph[now]:
next_weight = min(-w, x[1])
if next_weight > weight[x[0]]:
heapq.heappush(q, [-next_weight, x[0]])
weight[x[0]] = next_weight
import heapq, sys
input = sys.stdin.readline
n, m = map(int, input().split())
graph = [[] for _ in range(n+1)]
for _ in range(m):
a, b, c = map(int, input().split())
graph[a].append([b, c])
graph[b].append([a, c])
a, b = map(int, input().split())
weight = [0 for _ in range(n+1)]
move(a)
print(weight[b])
728x90
반응형
'알고리즘 > 최단경로' 카테고리의 다른 글
백준 온라인 저지, 최단경로 / 17396번: 백도어 (파이썬 / 백준 골드문제) (0) | 2021.11.14 |
---|---|
백준 온라인 저지, 최단경로 / 6087번: 레이저통신 (파이썬 / 백준 골드문제) (0) | 2021.11.14 |
백준 온라인 저지, 최단경로 / 18223번: 민준이와마산그리고건우 (파이썬 / 백준 골드문제) (0) | 2021.11.12 |
백준 온라인 저지, 최단경로 / 14284번: 간선이어가기2 (파이썬 / 백준 골드문제) (0) | 2021.11.09 |
백준 온라인 저지, 최단경로 / 1719번: 택배 (파이썬 / 백준 골드문제) (0) | 2021.09.15 |