https://www.acmicpc.net/problem/1774
1774번: 우주신과의 교감
(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼
www.acmicpc.net
https://github.com/stellaluminary/Baekjoon
GitHub - stellaluminary/Baekjoon
Contribute to stellaluminary/Baekjoon development by creating an account on GitHub.
github.com
기존 최소 신장 트리와 같다.
여러 우주신(노드)가 존재하고 cost가 적은 교신(edge)을 구하는 것이다.
다만 큰 차이점이라고 한다면 m개에 대하여 이미 특정 노드와 통로가 뚤려있다는 것이다.
이 부분을 고려한 코드를 구현하면 다음과 같다.
import sys
input = sys.stdin.readline
def f_p(p, x):
if p[x] != x:
p[x] = f_p(p, p[x])
return p[x]
def union(p, a, b):
a, b = f_p(p, a), f_p(p, b)
p[max(a,b)] = min(a,b)
def dist(c1, c2):
return ((c1[0] - c2[0])**2 + (c1[1] - c2[1])**2)**0.5
n, m = map(int, input().split())
p = [i for i in range(n+1)]
coord, edges = [], []
res = 0
for i in range(n):
x, y = map(int, input().split())
coord.append((x,y))
for j in range(m):
a, b = map(int, input().split())
union(p, a, b)
for i in range(n-1):
for j in range(i+1, n):
edges.append((dist(coord[i], coord[j]), i+1, j+1))
edges.sort()
for edge in edges:
c, a, b = edge
if f_p(p, a) != f_p(p, b):
union(p, a, b)
res += c
print('%.2f' %(res))