Baekjoon #6497

Baekjoon #6497

1개의 풀이 · Python

문제 원문 보기 ↗

SOLUTION INFO

Python · main.py

main.py
import sys

def input():
    return sys.stdin.readline().rstrip()

while True:
    n, m = map(int, input().split())
    
    if n == 0 and m == 0:
        break
    
    edge = []
    total = 0
    for _ in range(m):
        x, y, w = map(int, input().split())
        edge.append([x, y, w])
        total += w
    num_edge = 0
    edge.sort(key=lambda x: -x[2])

    # Disjoint set 구성
    dis_set = [-1 for _ in range(n+1)]
    def upward(x, change_lst):
        if dis_set[x] < 0:
            return x
        change_lst.append(x)
        return upward(dis_set[x], change_lst)

    def find_root(x):
        change_lst = []
        res = upward(x, change_lst)

        for idx in change_lst:
            dis_set[idx] = res
        return res

    def union(x, y):
        x_root = find_root(x)
        y_root = find_root(y)
        if x_root != y_root: # 두 node의 root가 다르다면?
            if dis_set[x_root] < dis_set[y_root]:
                dis_set[y_root] = x_root
            if dis_set[x_root] > dis_set[y_root]:
                dis_set[x_root] = y_root
            else:
                dis_set[x_root] = -1
                dis_set[y_root] = x_root
                
    # 크루스칼 시작
    sol = 0
    while num_edge < n-1:
        x, y, w = edge.pop()
        if find_root(x) != find_root(y):
            union(x, y)
            sol += w
            num_edge += 1

    print(total - sol)

SOLUTION DESCRIPTION

풀이 설명

등록된 풀이 설명이 없습니다.