Leta Learns

[Python] 백준 1647번 - 도시 분할 계획 본문

Coding/백준

[Python] 백준 1647번 - 도시 분할 계획

leta 2021. 8. 28. 13:12

문제 https://www.acmicpc.net/problem/1647

 

1647번: 도시 분할 계획

첫째 줄에 집의 개수N, 길의 개수M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 집

www.acmicpc.net

 

크루스칼 사랑해.

이제 크루스칼은 문제 이해만 잘 하면 나름 수월하게 풀 수 있다.

근데 그 문제 이해가 오래 걸린다..

이걸 어떻게 크루스칼로 풀어야 하는지, 이게 왜 크루스칼인지.. 뭐 풀다보면 익숙해지겠지..?

 

 

import sys
input = sys.stdin.readline

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

def union(a, b):
    a = find(a)
    b = find(b)
    if a > b:
        parent[a] = b
    else:
        parent[b] = a

n, m = map(int, input().split())
edge = []
parent = [i for i in range(n+1)]
ans = 0

for i in range(m):
    a, b, c = map(int, input().split())
    edge.append((a, b, c)) #c: 가중치

edge.sort(key=lambda x:x[2])

for i in range(1, n+1):
    parent[i] = i

for i in edge:
    a, b, c = i
    if find(a) != find(b):
        union(a, b)
        ans += c
        last = c
print(ans - last)

 

 

Comments