====== 별자리 만들기 ======
===== 풀이 =====
* 2차원에서의 유클리디안 [[ps:최소 신장 트리]] 문제.
* 유클리디안 MST는 링크에 설명했듯이 (구현은 안해봤지만) O(nlogn)에 풀수 있는 효율적인 알고리즘도 있지만, n이 워낙 작아서 그냥 일반적인 MST 알고리즘을 써도 충분히 빠르다. 심지어는, 이 문제에서는 O(n^2)의 프림 알고리즘보다, O(n^2logn)의 크루스칼 알고리즘이 실제로는 살짝 더 빠르게 돌았다.
===== 코드 =====
==== 코드 1 - Prim ====
"""Solution code for "BOJ 4386. 별자리 만들기".
- Problem link: https://www.acmicpc.net/problem/4386
- Solution link: http://www.teferi.net/ps/problems/boj/4386
Tags: [MST]
"""
import math
from teflib import graph as tgraph
def main():
n = int(input())
coords = [[float(x) for x in input().split()] for _ in range(n)]
mat_graph = tgraph.create_mat_graph(
n, lambda u, v: math.dist(coords[u], coords[v]))
mst_edges = tgraph.minimum_spanning_tree_dense(mat_graph)
answer = sum(w for u, v, w in mst_edges)
print(f'{answer:.2f}')
if __name__ == '__main__':
main()
* Dependency
* [[:ps:teflib:graph#minimum_spanning_tree_dense|teflib.graph.minimum_spanning_tree_dense]]
* [[:ps:teflib:graph#create_mat_graph|teflib.graph.create_mat_graph]]
==== 코드 2 - Krusakal ====
"""Solution code for "BOJ 4386. 별자리 만들기".
- Problem link: https://www.acmicpc.net/problem/4386
- Solution link: http://www.teferi.net/ps/problems/boj/4386
Tags: [Minimum spanning tree]
"""
import math
import sys
from teflib import graph as tgraph
def main():
n = int(input())
coords = []
edges = []
for u in range(n):
coord_u = [float(x) for x in sys.stdin.readline().split()]
edges.extend((u, v, math.dist(coord_u, coord_v))
for v, coord_v in enumerate(coords))
coords.append(coord_u)
mst_edges = tgraph.minimum_spanning_tree(edges, n)
answer = sum(w for u, v, w in mst_edges)
print(f'{answer:.2f}')
if __name__ == '__main__':
main()
{{tag>BOJ ps:problems:boj:골드_4}}