1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import sys
input = sys.stdin.readline
from collections import deque
Vn, En = map(int, input().split())
V = {}
upper = 1
lower = 1000000000
for i in range(1, Vn + 1) :
V[i] = []
for i in range(En) :
v1, v2, c = map(int, input().split())
V[v1].append([v2, c])
V[v2].append([v1, c])
upper = max(upper, c)
lower = min(lower, c)
start, end = map(int, input().split())
def BFS(weight) :
que = deque()
que.append(start)
gone[start] = True
while que :
now = que.popleft()
if now == end :
return True
for next, limit in V[now] :
if not gone[next] and limit >= weight :
gone[next] = True
que.append(next)
return False
while upper >= lower :
gone = [False for i in range(Vn + 1)]
center = (upper + lower) // 2
if BFS(center) :
lower = center + 1
else :
upper = center - 1
print(upper)
|
cs |
line 5 ~ 18
인풋을 받아 연결관계 dict V를 작성한다. 이분탐색의 upper, lower bound가 될 최대/최소 무게제한도 기록한다.
line 20 ~ 32
weight를 인풋으로 받는 함수 BFS를 정의한다.
간선의 비용(=무게제한)이 weight보다 클 때에만 이동하며 end에 도달가능한지 판별해 T/F를 리턴한다.
line 34 ~ 41
BFS의 인풋 weight를 upper, lower bound의 중간에서부터 시작해 범위를 좁혀나가는 이분탐색을 반복한다.
바운드가 교차했을 때 탐색을 멈추고 정답을 출력한다.
'Week 01 ~ 04 : 알고리즘 문제 풀이' 카테고리의 다른 글
파이썬 백준 18405 경쟁적 전염 (0) | 2021.11.25 |
---|---|
파이썬 백준 4256 트리 (0) | 2021.11.25 |
파이썬 백준 1005 ACM Craft (0) | 2021.11.25 |
파이썬 백준 2573 빙산 (0) | 2021.11.23 |
파이썬 백준 1948 임계경로 (0) | 2021.11.23 |