본문 바로가기
Algorithm/Baekjoon

1800. 인터넷 설치 (Python)

by 원만사 2022. 4. 4.
반응형
 

1800번: 인터넷 설치

첫 번째 줄에 N(1 ≤ N ≤ 1,000), 케이블선의 개수 P(1 ≤ P ≤ 10,000), 공짜로 제공하는 케이블선의 개수 K(0 ≤ K < N)이 주어진다. 다음 P개의 줄에는 케이블이 연결하는 두 컴퓨터 번호와 그 가격이 차

www.acmicpc.net

 

풀이

 이분탐색과 다익스트라를 결합하여 해결하는 문제다. 과정은 다음과 같다.

 

1. 먼저 이분탐색을 통해 기준이 되는 가격을 설정한다.

2. 그 후 다익스트라를 통해서 1번과 N번을 연결한다.

3. 이 때, 기존에는 dist 배열에 시작 지점부터 해당 지점까지의 최단 거리를 넣어줬는데 이번 문제에서는 기준 가격을 넘는 케이블을 몇 개 사용했는지를 담는다.

4. 마지막에 dist[N]의 값이 공짜로 제공되는 케이블선의 개수인 K개 이하인지를 체크한다.

 

 만약, dist[N]의 값이 K개 이하라면 기준 가격으로 1번과 N번을 연결할 수 있음을 뜻한다.

 

코드

import sys
import heapq
input = sys.stdin.readline
INF = float('INF')

# base: base를 초과하는 가격을 가진 케이블을 공짜로 사용한다.
def dijkstra(base):
    q = []
    heapq.heappush(q, (0, 1))
    dist = [INF for _ in range(N+1)] # dist[n]: 1번부터 n번을 연결하는 데 사용된 공짜 케이블 개수 
    dist[1] = 0

    while q:
        d, now = heapq.heappop(q)

        if dist[now] < d:
            continue

        for (next, nextDist) in graph[now]:
            cost = d
            if nextDist > base: # 기준 가격을 초과한다면 
                cost += 1 # 공짜 케이블 개수를 하나 증가시킨다.

            if cost < dist[next]:
                dist[next] = cost
                heapq.heappush(q, (cost, next))

    # 1번과 N번을 연결하는 데 K개 이하의 공짜 케이블이 사용된다면
    # base 가격은 정답이 될 수 있다.
    return dist[N] <= K 


if __name__ == '__main__':
    # N: 학생들의 번호, P: 케이블선의 개수, K: 공짜로 제공하는 케이블선의 개수
    N, P, K = map(int, input().split())
    graph = [[] for _ in range(N+1)] # 케이블 선 정보

    for _ in range(P):
        a, b, c = map(int, input().split())
        graph[a].append((b, c))
        graph[b].append((a, c))

    left = 0
    right = 1_000_000
    res = -1

    while left <= right:
        mid = (left + right) // 2 # 이분 탐색으로 기준 가격 설정

        if dijkstra(mid):
            res = mid
            right = mid - 1
        else:
            left = mid + 1

    print(res)
반응형

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

1011. Fly me to the Alpha Centauri (Python)  (0) 2022.04.05
1765. 닭싸움 팀 정하기 (Python)  (0) 2022.04.05
10159. 저울 (Python)  (0) 2022.04.02
4256. 트리 (Python)  (0) 2022.03.26
3745. 오름세 (Python)  (0) 2022.03.23

댓글