-
[백준] 4386번 별자리 만들기(파이썬, MST)Coding Test/Algorithm 2021. 10. 31. 19:06
https://www.acmicpc.net/problem/4386
이번 문제는 최소 스패닝 트리 문제였다.
kuruskal mst 알고리즘을 사용했다.
핵심은 간선간의 비용은 좌표 간의 거리이며 2차 평면에서 두 좌표의 거리는 직각삼각형을 그려서 빗변의 길이를 구하면 두 좌표간의 거리가 된다.
x1, y1 과 x2, y2 두 좌표가 있다면
|x1 - x2|^2 + |y1 - y2|^2
의 루트 값이 바로 두 좌표간의 거리가 된다.
import sys import heapq n = int(sys.stdin.readline()) parent = {} graph = [] def find(x): if parent[x] == False: return x p = find(parent[x]) parent[x] = p return p def union(x, y): if parent[x] < parent[y]: parent[x] += parent[y] parent[y] = x else: parent[y] += parent[x] parent[x] = y for _ in range(n): x, y = map(float, sys.stdin.readline().split()) parent[(x, y)] = False graph.append((x, y)) arr = [] for i in range(n-1): a = graph[i][0] b = graph[i][1] for j in range(i+1, n): x = graph[j][0] y = graph[j][1] dx = abs(a-x) dy = abs(b-y) l = round((dx**2 + dy**2)**0.5, 2) heapq.heappush(arr, [l, (a, b), (x, y)]) cnt = n-1 answer = 0 while(cnt): l, a, b = heapq.heappop(arr) ar = find(a) br = find(b) if ar != br: union(ar, br) answer += l cnt -= 1 print(answer)
요로코롬 풀었다.
'Coding Test > Algorithm' 카테고리의 다른 글
[백준] 1644번 소수의 연속합 (파이썬, 두 포인터) (0) 2021.11.03 [백준] 17404번 RGB거리2 (파이썬, DP) feet. 인간적인 코딩 (0) 2021.11.01 [백준] 2473번 세 용액 (파이썬, 두 포인터) (0) 2021.10.29 [백준] 2239번 스도쿠 (파이썬, DFS) (0) 2021.10.27 [2021 KAKAO BLIND RECRUITMENT] 메뉴 리뉴얼 (파이썬) (2) 2021.09.11