백준 4386 - 별자리 만들기 (파이썬)

Updated:

좌표끼리의 거리를 계산하고 크루스칼 알고리즘을 사용해 해결했습니다.

import sys
import math

input = sys.stdin.readline

def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
        
    return parent[x]

def union(a, b, c):
    global result
    a = find(a)
    b = find(b)
    
    if a != b:
        if a < b:
            parent[b] = a
        else:
            parent[a] = b
        result += c
        
n = int(input())
parent = [i for i in range(n + 1)]
stars = [list(map(float, input().split())) for _ in range(n)]
edges = []
result = 0

for i in range(n - 1):
    for j in range(i + 1, n):
        edges.append((math.sqrt((stars[i][0] - stars[j][0])**2 + (stars[i][1] - stars[j][1])**2), i, j))
       
edges.sort()

for edge in edges:
    cost, x, y = edge
    union(x, y, cost)
    
print(round(result, 2))

Categories:

Updated: