DonHurry

[Python] ๋ฐฑ์ค€ 1774๋ฒˆ - ์šฐ์ฃผ์‹ ๊ณผ์˜ ๊ต๊ฐ ๋ณธ๋ฌธ

Problem Solving

[Python] ๋ฐฑ์ค€ 1774๋ฒˆ - ์šฐ์ฃผ์‹ ๊ณผ์˜ ๊ต๊ฐ

_๋„๋… 2022. 11. 16. 16:17

๐Ÿ“– ๋ฌธ์ œ

 

1774๋ฒˆ: ์šฐ์ฃผ์‹ ๊ณผ์˜ ๊ต๊ฐ

(1,1) (3,1) (2,3) (4,3) ์ด๋ ‡๊ฒŒ ์šฐ์ฃผ์‹ ๋“ค๊ณผ ํ™ฉ์„ ์ž์”จ์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์กŒ๊ณ  1๋ฒˆํ•˜๊ณ  4๋ฒˆ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด 1๋ฒˆํ•˜๊ณ  2๋ฒˆ์„ ์ž‡๋Š” ํ†ต๋กœ๋ฅผ ๋งŒ๋“ค๊ณ  3๋ฒˆํ•˜๊ณ  4๋ฒˆ์„ ์ž‡๋Š” ํ†ต๋กœ๋ฅผ ๋งŒ๋“ค๋ฉด ์‹ ๋“ค๊ณผ ์„ ์ž์”จ๋ผ

www.acmicpc.net

 

๐Ÿ”Ž ํ’€์ด

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ฐฑ์ค€ 4386๋ฒˆ ๋ณ„์ž๋ฆฌ ๋งŒ๋“ค๊ธฐ ๋ฌธ์ œ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ์€ ์ด๋ฏธ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ„์„ ์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ํ†ต๋กœ๋“ค์€ ๊ธธ์ด ํ•ฉ์— ๋„ฃ์–ด์ค„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์ „์—, ์—ฐ๊ฒฐ๋œ ํ†ต๋กœ๋“ค์˜ root๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์ค๋‹ˆ๋‹ค. root๋ฅผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•œ union ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์šฐ์ฃผ์‹ ์ด 1๋ฒˆ์ด ์•„๋‹Œ 0๋ฒˆ๋ถ€ํ„ฐ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ป ์ฝ”๋“œ

import sys
input = sys.stdin.readline

# root๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜
def find_parents(x):
    if parents[x] == x:
        return x
    return find_parents(parents[x])

# root๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ํ•จ์ˆ˜
def union_parents(a, b):
    a = find_parents(a)
    b = find_parents(b)
    if a < b:
        parents[b] = a
    else:
        parents[a] = b

# ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
def cal_dist(x1, y1, x2, y2):
    return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5


N, M = map(int, input().split())
parents = [int(x) for x in range(N)]
graph = []

for _ in range(N):
    x, y = map(int, input().split())
    graph.append((x, y))

# ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ํ†ต๋กœ๋“ค์˜ root ํ•ฉ์น˜๊ธฐ
for _ in range(M):
    a, b = map(int, input().split())
    union_parents(a-1, b-1)

ans = 0
dist = []

for i in range(N):
    for j in range(i+1, N):
        # ํ†ต๋กœ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
        cost = cal_dist(graph[i][0], graph[i][1], graph[j][0], graph[j][1])
        dist.append((cost, i, j))

# ์ตœ์†Œ ๊ฑฐ๋ฆฌ ์ˆœ์œผ๋กœ ๋‚˜์—ด
dist.sort()
for k, i, j in dist:
    # ๋‘ ๋ณ„์˜ root๊ฐ€ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด ๊ฑฐ๋ฆฌ๋น„์šฉ ์ถ”๊ฐ€ํ•˜๊ณ  root ํ•ฉ์น˜๊ธฐ
    if find_parents(i) != find_parents(j):
        union_parents(i, j)
        ans += k

print(f'{ans:.2f}')