크루스칼 알고리즘은 탐욕 알고리즘(Greedy Algorithm)의 일종으로, 가중치가 가장 작은 간선부터 차례대로 선택하여 MST를 구성.
이때, 사이클이 형성되는 간선은 제외.
동작 과정:
장점:
시간 복잡도: O(E log E) (E는 간선의 수)
프림 알고리즘 또한 탐욕 알고리즘으로, 시작 정점을 선택한 후, 해당 정점에 연결된 간선들 중에서 가중치가 가장 작은 간선을 선택하여 MST를 확장해 나감.
동작 과정:
장점:
시간 복잡도: O(E log V) (E는 간선의 수, V는 정점의 수) - 우선순위 큐 사용 시
def union(a, b):
a = find(parents[a])
b = find(parents[b])
if a < b:
parents[b] = a
else:
parents[a] = b
def find(x):
if parents[x] != x:
parents[x] = find(parents[x])
return parents[x]
def kruskal(N, edges):
total = 0
edges.sort(key = lambda x : x[0])
for cost, a, b in edges:
if find(a) != find(b):
union(a, b)
total += cost
return total
T = int(input())
for tc in range(1, T+1):
N = int(input())
position_x = list(map(int, input().split()))
position_y = list(map(int, input().split()))
parents = [i for i in range(N)]
edges = []
E = float(input())
for i in range(N-1):
for j in range(i+1, N):
dx = abs(position_x[j] - position_x[i])
dy = abs(position_y[j] - position_y[i])
cost = dx**2 + dy ** 2
edges.append((cost, i, j))
total_cost = kruskal(N, edges)
result = total_cost * E
print(f"#{tc} {result:.0f}")