# 우주신과의 교감
import math
import heapq
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
def prim(start):
result = 0
visited = [False] * (N+1)
q = []
heapq.heappush(q, (0, start))
while q:
dist, node = heapq.heappop(q)
if visited[node]:
continue
visited[node] = True
result += dist
for ndist, nnode in arr[node]:
heapq.heappush(q, (ndist, nnode))
return result
# 노드 위치 정보
nodes = [[]]
for _ in range(N):
nodes.append(list(map(int, input().split())))
# 이미 연결되어 있는 값을 저장
connected = set()
for _ in range(M):
x, y = map(int, input().split())
connected.add((x, y))
connected.add((y, x))
# 연결리스트
arr = [[] for _ in range(N+1)]
for i in range(1, N+1):
for j in range(i+1, N+1):
# 이미 연결되어 있다면 dist를 0으로
if (i, j) in connected:
arr[i].append((0, j))
arr[j].append((0, i))
continue
# 연결 되지 않았다면
dist = math.sqrt((nodes[i][0]-nodes[j][0])**2 +
(nodes[i][1]-nodes[j][1])**2)
arr[i].append((dist, j))
arr[j].append((dist, i))
print("%.2f" % prim(1))
최단거리, 프림
1. nodes : 노드의 위치 정보를 입력받는다.
2. connected : 이미 연결되어 있는 노드들의 정보를 입력받는다.
3. 연결 리스트 정의
- 연결 값이 connected에 있다면 거리는 0으로
- 연결 값이 connected에 없다면 거리는 2차원 상의 거리
4. 프림 알고리즘
- 현재 그래프에 연결된 모든 간선의 값 중에서 가장 작은 간선을 하나씩 포함
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 17852번 - 주사위 윷놀이 (파이썬) (0) | 2022.03.18 |
---|---|
[백준] 20040번 - 사이클 게임 (파이썬) (0) | 2022.03.16 |
[백준] 17299번 - 오등큰수 (파이썬) (0) | 2022.03.14 |
[백준] 17298번 - 오큰수 (파이썬) (0) | 2022.03.14 |
[백준] 6497번 - 전력난 (파이썬) (0) | 2022.03.13 |