https://www.acmicpc.net/problem/1939
1939번: 중량제한
첫째 줄에 N, M(1 ≤ M ≤ 100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1 ≤ A, B ≤ N), C(1 ≤ C ≤ 1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이
www.acmicpc.net
import sys
input = sys.stdin.readline
def check(weight): # 목적지 도착 여부를 체크하는 함수
visited = [False] * (n + 1)
visited[start] = True
stack = [start]
while stack:
current = stack.pop()
if current == end: # 목적지 도착!
return True
for node, bridge_w in arr[current]:
if bridge_w >= weight and not visited[node]: # 들고온 짐 그대로 건너갈 수 있나?
visited[node] = True
stack.append(node)
return False
n, m = map(int, input().split())
arr = [[] for _ in range(n + 1)]
for _ in range(m):
a, b, c = map(int, input().split())
arr[a].append((b, c)) # 양방향이므로 둘 다 넣어줌!
arr[b].append((a, c))
start, end = map(int, input().split())
# 이진탐색 이용
left = 1
right = 1000000000
while left <= right:
mid = (left + right) // 2
if check(mid): # 시작지점에서 mid의 중량이 끝까지 도착할 수 있으면?
left = mid + 1
else:
right = mid - 1
print(right)
- 이진탐색을 이용하면 최댓값 찾기가 그렇게 복잡해지지 않는구나! -> 최댓값 찾기 애먹었는데... 나중에 이용해보자
- 처음엔 양방향 고려를 안했었다...
- 특별한 의미가 없으면 1과 -1 대신 True 와 False를 사용하는 것이 좋다
- 문제를 잘못이해했었더니 헤맸다... -> 가장 기본이므로 문제를 잘!!읽자!!
'백준' 카테고리의 다른 글
백준 2531. 회전 초밥 (0) | 2023.11.13 |
---|---|
백준 1135. 뉴스 전하기 (0) | 2023.11.07 |
백준 1520. 내리막 길 (0) | 2023.11.01 |
백준 4485. 녹색 옷 입은 애가 젤다지? (0) | 2023.10.30 |
백준 18430. 무기 공학 (0) | 2023.10.27 |