[백준] 2211번 네트워크 복구 ★

거북이·2023년 9월 13일
0

백준[골드2]

목록 보기
7/8
post-thumbnail

💡문제접근

  • N(1 ≤ N ≤ 1,000)개의 컴퓨터로 구성된 네트워크가 있다. 이들 중 몇 개의 컴퓨터들은 서로 네트워크 연결이 되어 있어 서로 다른 두 컴퓨터 간 통신이 가능하도록 되어 있다. 통신을 할 때에는 서로 직접 연결되어 있는 회선을 이용할 수도 있으며, 회선과 다른 컴퓨터를 거쳐서 통신을 할 수도 있다. → 직접 가는 경로와 거쳐 가는 경로의 값을 비교해 작은 값을 취한다.
  • 각 컴퓨터들과 회선은 그 성능이 차이가 날 수 있다. 따라서 각각의 직접 연결되어 있는 회선을 이용해서 통신을 하는데 걸리는 시간이 서로 다를 수 있다. 심지어는 직접 연결되어 있는 회선이 오히려 더 느려서, 다른 컴퓨터를 통해서 통신을 하는 것이 더 유리할 수도 있다. 직접 연결되어 있는 회선을 사용할 경우에는 그 회선을 이용해서 통신을 하는 데 드는 시간만큼이 들게 된다. 여러 개의 회선을 거치는 경우에는 각 회선을 이용해서 통신을 하는 데 드는 시간의 합만큼의 시간이 걸리게 된다.
  • 컴퓨터들의 번호는 1부터 N까지의 정수이며, 1번 컴퓨터는 보안 시스템을 설치할 슈퍼컴퓨터이다. 모든 통신은 완전쌍방향 방식으로 이루어지기 때문에, 한 회선으로 연결된 두 컴퓨터는 어느 방향으로도 통신할 수 있다.

💡코드(메모리 : 84144KB, 시간 : 664ms)

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)

def dijkstra(start):
    q = []
    heapq.heappush(q, [0, start])
    distance[start] = 0
    while q:
        dist, now = heapq.heappop(q)
        if distance[now] < dist:
            continue
        for i in graph[now]:
            cost = dist + i[1]
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                parent[i[0]] = now
                heapq.heappush(q, [cost, i[0]])

N, M = map(int, input().strip().split())
graph = [[] for _ in range(N+1)]
parent = [0] * (N+1)
distance = [INF] * (N+1)

for _ in range(M):
    a, b, c = map(int, input().strip().split())
    # 완전쌍방향으로 모든 통신이 이루어지므로
    graph[a].append([b, c])
    graph[b].append([a, c])

dijkstra(1)

print(N-1)
for i in range(2, N+1):
    print(i, parent[i])

💡소요시간 : 43m

0개의 댓글