본문 바로가기
Algorithm/Baekjoon

13905. 세부 (Python)

by 원만사 2022. 6. 17.
반응형

 

 

13905번: 세부

첫 번째 줄에는 섬에 존재하는 집의 수 N(2≤N≤100,000)와 다리의 수 M(1≤M≤300,000)이 주어진다. 두 번째 줄에는 숭이의 출발 위치(s)와 혜빈이의 위치(e)가 주어진다. (1≤s, e≤N, s≠e). 다음 M개의 줄

www.acmicpc.net

 

풀이

 모든 경로를 탐색해가면서 최대 개수를 구하면 시간초과가 발생한다. 따라서 처음부터 모든 경로를 탐색하는 것이 아니라 임의의 개수 k개를 혜빈이의 위치까지 들고갈 수 있는 경로가 있는지를 탐색하면 된다. 임의의 개수 k개는 이분 탐색을 사용하여 정할 수 있다. 즉, 이분 탐색과 BFS를 사용하여 문제를 해결하면 된다.

 

코드

import sys
from collections import deque
input = sys.stdin.readline


# base개를 사용하여 s에서 e로 갈 수 있는지를 BFS를 사용하여 체크
def bfs(base):
    q = deque()
    q.append(s)  # s부터 시작
    visited = [False for _ in range(N+1)]
    visited[s] = True

    while q:
        now = q.popleft()

        if now == e:  # e에 도달했다면 True를 반환
            return True

        for nextHouse, nextCount in graph[now]:
            # base개를 들고갈 수 없는 경로라면 continue
            if visited[nextHouse] or nextCount < base:
                continue

            q.append(nextHouse)
            visited[nextHouse] = True

    return False  # e에 도달하지 못했다면 False 반환


if __name__ == '__main__':
    N, M = map(int, input().split())
    s, e = map(int, input().split())
    graph = [[] for _ in range(N+1)]
    visited = [-1 for _ in range(N+1)]

    left, right = 1, 1
    for _ in range(M):
        h1, h2, k = map(int, input().split())
        graph[h1].append((h2, k))
        graph[h2].append((h1, k))
        right = max(right, k)

    res = 0
    # 이분 탐색을 사용하여 들고갈 수 있는 빼빼로의 최대 개수를 구한다.
    while left <= right:
        mid = (left + right) // 2

        if bfs(mid):  # mid개를 s에서 e까지 들고갈 수 있는 경로가 있는 경우
            res = mid
            left = mid + 1
        else:
            right = mid - 1

    print(res)
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

2473. 세 용액 (Python)  (0) 2022.06.19
2629. 양팔저울 (Python)  (0) 2022.06.18
2251. 물통 (Python)  (0) 2022.06.16
17612. 쇼핑몰 (Python)  (0) 2022.06.14
17616. 등수 찾기 (Python)  (0) 2022.06.13

댓글