📌 군사가 가장 많이 이동할 수 있는 경로 중 가장 작은 길의 너비를 뽑는다는 아이디어를 떠올리기 어려웠던 문제
📌 최단 이동 거리가 필요한게 아니라 가장 많은 군사가 이동할 수 있는 경로라는 것이 중요 !
📌 최대힙으로 생성 후 최대값 순서로 뽑아 경로를 연결하며, 출발지와 목적지가 한 경로로 이어졌을 때 마지막으로 뽑은 값이 경로 중 최소값이 될 수 밖에 없다
전쟁 당시 Baekjoon World의 국왕은 Cube World를 공격할 작전을 세운 적이 있습니다.
Baekjoon World와 Cube World는 p개의 지점과 w개의 길로 표현됩니다.
모든 길은 양방향이며, 각 길마다 너비가 존재하여 이에 비례하는 수의 군사가 지나갈 수 있습니다.
Baekjoon World의 국왕은 군사들이 뭉치는 것이 유리하다고 생각해서,
미리 Cube World로 가는 경로를 정해 두고 그 경로로만 모든 군사를 보냈습니다.
Baekjoon World의 국왕은 총명해서, 경로 상에 있는 길 중 너비가 가장 좁은 길의 너비를 최대화하는 경로를 택했습니다.
그런데 전쟁 때문에 어느 길로 보냈는지에 대한 기록이 불타 없어져 버렸습니다.
전쟁사를 완성하려면 이 기록이 꼭 필요합니다.
위대한 과학자인 당신이 다시 복구해 주세요.
import sys, heapq
input = sys.stdin.readline
def find(x):
if parent[x] == x: return x
parent[x] = find(parent[x])
return parent[x]
def union(x, y):
x, y = find(x), find(y)
if x == y: return False
if rank[x] < rank[y]:
x, y = y, x
parent[y] = x
if rank[x] == rank[y]:
rank[x] += 1
return True
p, w = map(int, input().split())
c, v = map(int, input().split())
heap = []
for _ in range(w):
start, end, width = map(int, input().split())
heapq.heappush(heap, (-width, start, end))
parent = [i for i in range(p)]
rank = [1] * p
answer = 0
while heap:
width, start, end = heapq.heappop(heap)
if union(start, end):
if find(c) == find(v):
answer = -width
break
print(answer)