๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿƒ algorithm/boj

BOJ 14950 - ์ •๋ณต์ž

by HandHand 2021. 6. 25.

๋ฌธ์ œ

๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€ - 1๋ฒˆ

ํ’€์ด ๊ณผ์ •

๋ชจ๋“  ์ •์ ์„ ์ž‡๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ๊ฐ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ• ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— t * ์ด์ „๊นŒ์ง€ ์„ ํƒ๋œ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ ๋งŒํผ ์ถ”๊ฐ€์ ์ธ ๊ฐ’์„ ๋ˆ„์ ํ•ด์ค๋‹ˆ๋‹ค.

์ฝ”๋“œ


import sys


def union(u, v):
    pv, pu = find(u), find(v)

    if pv != pu:
        if rank[pv] > rank[pu]:
            parent[pu] = pv
        else:
            if rank[pv] == rank[pu]:
                rank[pu] += 1

            parent[pv] = pu


def find(u):
    if parent[u] == u:
        return u

    parent[u] = find(parent[u])

    return parent[u]


def solution():
    acc = 0
    found = 0

    roads.sort(key=lambda r: r[2])

    for frm, to, cost in roads:
        if find(frm) != find(to):
            union(frm, to)
            acc += (cost + found * t)
            found += 1

            if found == N - 1:
                break

    return acc


if __name__ == '__main__':
    N, M, t = list(map(int, sys.stdin.readline().split()))
    roads = [list(map(int, sys.stdin.readline().split())) for _ in range(M)]

    parent = [v for v in range(N + 1)]
    rank = [0] * (N + 1)

    answer = solution()
    print(answer)

๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€