From d3a0808ed2d9c19d9697cd2e23c52629e6cd063a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A7=80=ED=98=84=EC=84=9C?= <113419425+3veryDay@users.noreply.github.com> Date: Tue, 13 Jan 2026 08:43:11 +0900 Subject: [PATCH] =?UTF-8?q?260113=20:=20[BOJ=2020183]=20=EA=B3=A8=EB=AA=A9?= =?UTF-8?q?=20=EB=8C=80=EC=9E=A5=20=ED=98=B8=EC=84=9D=20-=20=ED=9A=A8?= =?UTF-8?q?=EC=9C=A8=EC=84=B1=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _hyunseo/20183.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 _hyunseo/20183.py diff --git a/_hyunseo/20183.py b/_hyunseo/20183.py new file mode 100644 index 00000000..e58f3f8d --- /dev/null +++ b/_hyunseo/20183.py @@ -0,0 +1,60 @@ +#260113 : [BOJ 20183] 골목 대장 호석 - 효율성 2 + +import sys, heapq +input = sys.stdin.readline + +N, M, A, B, C = map(int, input().split()) + + +adj = [[] for _ in range(N+1)] +MAX_COST = 0 +for _ in range(M ) : + a, b, cost = map(int, input().split()) + MAX_COST = max(cost, MAX_COST) + adj[b].append((a, cost)) + adj[a].append((b, cost)) + +def solve(limit) : + # 주어진 limit이 내가 견딜 수 있는 최대 수치심일 때 + # 내가 가지고 있는 돈 C로 이 길 돌파가 가능한지 + # 가능하면 true, 불가능하면 false + + # 다익스트라 초기화 + distances = [float('inf')] * (N + 1) + distances[A] = 0 + pq = [(0, A)] # (누적 비용, 현재 노드) + + while pq: + curr_dist, curr_node = heapq.heappop(pq) + + if distances[curr_node] < curr_dist: + continue + + if curr_node == B: # 목적지 도착 시 조기 종료 가능 + break + + for next_node, weight in adj[curr_node]: + # 이번 경로의 가중치(수치심)가 limit보다 크면 아예 지나가지 않음 + if weight <= limit: + new_dist = curr_dist + weight + if new_dist < distances[next_node]: + distances[next_node] = new_dist + heapq.heappush(pq, (new_dist, next_node)) + + # 도착점까지의 최단 거리 합이 예산 C 이내? + return distances[B] <= C + + + +l, r = 0, MAX_COST +ans = -1 +while l <= r : + mid = (l + r ) // 2 + + if solve(mid) : + ans = mid + r = mid -1 + else : + l = mid + 1 + +print(ans)