Algorithm/SW Expert Academy

[Python] 5249. 최소신장트리

느낌표 공장장 2021. 10. 18. 23:57
def find(x):
if par[x] == x:
return x
else:
return find(par[x])
def union(x, y):
x = find(x)
y = find(y)
if rank[x] > rank[y]:
par[y] = x
elif rank[x] < rank[y]:
par[x] = y
else:
par[y] = x
rank[x] += 1
tc = int(input())
for idx in range(1, tc+1):
v, e = map(int, input().split())
par = list(range(v+1)) # 루트
rank = [0 for _ in range(v+1)]
tmp = []
for _ in range(e):
n1, n2, w = map(int, input().split())
tmp.append([n1, n2, w])
tmp.sort(key=lambda x: x[2]) # 가중치에 따라 오름차순으로 정렬 -> 가중치가 가장 낮은 간선부터 선택하면서 트리 증가
answer = 0
for arr in tmp:
if find(arr[0]) == find(arr[1]): # 사이클이 존재(이미 연결되어 있으면)하면 다음으로 가중치가 낮은 간선 선택
continue
union(arr[0], arr[1])
answer += arr[2]
print('#{} {}'.format(idx, answer))

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 5251. 최소이동거리  (0) 2021.10.18
[Python] 2814. 최장경로  (0) 2021.10.13
[Python] 1952. 수영장  (0) 2021.10.12
[Python] 2105. 디저트 카페  (0) 2021.10.12
[Python] 4012. 요리사  (0) 2021.10.12