본문 바로가기
문제 해결/BOJ

[백준] 그리드 네트워크

by 자잘 2023. 3. 2.

https://www.acmicpc.net/problem/18769

 

18769번: 그리드 네트워크

재현이는 그리드 네트워크 컨설팅 회사를 운영하고 있다. 어떤 회사의 데이터 서버가 격자 형태의 그래프로 주어졌을 때, 최소의 비용을 들여서 전용 통신망을 설치하려고 한다. 이때, 전용 통

www.acmicpc.net

파이썬으로 인해 하루넘게 억까 당한 문제입니다. heapq를 사용하면 이 문제를 절대 통과가 불가능합니다. 따라서, 프림으로는 절대 풀 수 없고 우선순위 큐 대신 간선들을 정렬하여 크루스칼을 적용해주면 간신히 통과가 가능합니다.

 

import sys
from collections import defaultdict

#sys.stdin = open("input.txt", "r")
input = sys.stdin.readline

T = int(input())
r, c = -1, -1
graph = None

parent = []
q = []

def find(p):
    global parent

    if parent[p] == p:
        return p
    parent[p] = find(parent[p])
    return parent[p]

def kruskal():
    global parent, q
    parent = [x for x in range(r * c)]

    cnt = 0
    total = 0
    size = len(q)
    q.sort()

    for i in range(size):
        w, a, b = q[i]

        pa = find(a)
        pb = find(b)

        if pa == pb:
            continue

        if pa < pb:
            parent[pb] = pa
        else:
            parent[pa] = pb

        cnt += 1
        total += w

        if cnt == r * c - 1:
            return total

    return total

for _ in range(T):
    r, c = tuple(map(int, input().split()))
    graph = defaultdict(list)
    q = []

    # 그래프 구축
    for i in range(r):
        w = list(map(int, input().split()))
        for j in range(c - 1):
            cur = i * c + j
            next = cur + 1
            q.append((w[j], cur, next))

    for i in range(r - 1):
        w = list(map(int, input().split()))
        for j in range(c):
            cur = i * c + j
            next = cur + c
            q.append((w[j], cur, next))

    print(kruskal())

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 싸지방에 간 준하  (0) 2023.03.04
[백준] 인싸들의 가위바위보  (0) 2023.03.03
[백준] Baaaaaaaaaduk2 (Easy)  (0) 2023.03.02
[백준] 미로 탈출하기  (0) 2023.03.01
[백준] 곡선 자르기  (0) 2023.02.27