728x90
1774번: 우주신과의 교감
(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼
www.acmicpc.net
🤔 문제분석
우주신끼르는 가장 짧은 길이로 연결되어야한다. 최소신장 트리를 이용하여 문제를 해결하면된다. 최소 신장 트리는 가장 짧은 간선을 사이클이 존재하지 않을때까지 반복하여 유니온한다.
💻 코드
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
node = []
for _ in range(N):
X, Y = map(int, input().split())
node.append((X, Y))
parent = [i for i in range(N+1)]
def find(v1):
if parent[v1] != v1:
parent[v1] = find(parent[v1])
return parent[v1]
else:
return v1
def union(v1, v2):
p1 = find(v1)
p2 = find(v2)
if parent[p1] > parent[p2]:
parent[p1] = parent[p2]
else:
parent[p2] = parent[p1]
def get_distance(y1, x1, y2, x2):
return (pow(abs((y1-y2)), 2) + pow(abs(x1 - x2), 2)) ** 0.5
edge = []
for i in range(len(node)):
for j in range(i+1, len(node)):
if i != j:
y1, x1 = node[i]
y2, x2 = node[j]
edge.append((get_distance(y1, x1, y2, x2), i+1, j+1))
edge.sort(key=lambda x:x[0])
for _ in range(M):
X, Y = map(int, input().split())
p1 = find(X)
p2 = find(Y)
if p1 != p2:
union(p1, p2)
ans = 0.00
for cost, i, j in edge:
p1 = find(i)
p2 = find(j)
if p1 != p2:
ans += cost
union(p1, p2)
ans = round(ans, 2)
print(f"{ans:.2f}")
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2668번 : 숫자고르기 (0) | 2024.03.21 |
---|---|
[백준] 5427번 : 불 (0) | 2024.03.21 |
[백준] 1956 : 운동 (1) | 2024.03.18 |
[백준] 4386번 : 별자리 만들기 (0) | 2024.03.18 |
[백준] 1963번 : 소수경로 (0) | 2024.03.18 |