Sangmun

백준 1774 우주신과의 교감 본문

알고리즘/백준

백준 1774 우주신과의 교감

상상2 2022. 8. 30. 23:10

https://www.acmicpc.net/problem/1774

 

1774번: 우주신과의 교감

(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼

www.acmicpc.net

백준 4386번 문제와 같은 유형의 문제이다.

이번에는 n이 1000개라 2중 for문을 돌리면 시간초과가 나오지 않을까 싶었는데 다행이도 2중 for문으로 통과가 되었다.

중간에 이미 연결된 우주신의 좌표들은 입력받자마자 union_find 해버리면 최소비용계산때 알아서 계산대상에서 제외가 된다.

import math
import sys
input = sys.stdin.readline

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

def union_parent(parent, a,b):
    a = find_parent(parent,a)
    b = find_parent(parent,b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

v, e = map(int, input().split())
parent = [0] * (v+1)

edges = []
result = 0

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

tmp_list = []
# 우주 신들의 좌표
for _ in range(v):
    a,b = map(float,input().split())
    tmp_list.append((a,b))

# 이미 연결되어 있는 우주신들의 index
for _ in range(e):
    a,b = map(int,input().split())
    # 입력 받자마자 union_find 실시
    union_parent(parent,a,b)

# 우주신들의 거리 계산
for idx1, j in enumerate(tmp_list):
    for idx2, k in enumerate(tmp_list):
        if idx1 == idx2:
            continue

        tmp_cost = (j[0] - k[0])**2 + (j[1] - k[1])**2
        tmp_cost = math.sqrt(tmp_cost)
        edges.append((tmp_cost,idx1+1,idx2+1))

edges.sort()

# 최소 비용 계산
for edge in edges:
    cost, a, b = edge

    if find_parent(parent,a) != find_parent(parent,b):
        union_parent(parent,a,b)
        result += cost

print(f"{result:.2f}")

'알고리즘 > 백준' 카테고리의 다른 글

백준 11403번 경로찾기  (0) 2022.10.01
백준 14624번 - 전북대학교  (0) 2022.09.28
백준 1766번 문제집  (0) 2022.09.05
백준 13913번 숨바꼭질 4  (0) 2022.08.30
백준 4386번 별자리 만들기  (0) 2022.08.25
Comments