문제
그래프에서 사이클을 제거하고 모든 노드를 포함하는 트리를 구성할 때, 가중치의 합이 최소가 되도록 만든 경우를 최소신장트리라고 한다.
0번부터 V번까지의 노드와 E개의 간선을 가진 그래프 정보가 주어질 때, 이 그래프로부터 최소신장트리를 구성하는 간선의 가중치를 모두 더해 출력하는 프로그램을 만드시오.
[입력]
첫 줄에 테스트 케이스의 개수 T가 주어지고, 테스트 케이스 별로 첫 줄에 마지막 노드번호 V와 간선의 개수 E가 주어진다.
다음 줄부터 E개의 줄에 걸쳐 간선의 양 끝 노드 n1, n2, 가중치 w가 차례로 주어진다.
1<=T<=50, 1<=V<=1000, 1<=w<=10, 1<=E<=1000000
[출력]
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
이해
- 제목과 같이 최소 신장 트리(MST)를 이용하여 풀기
2024.01.10 - [Algorithm/개념] - 크루스칼(Kruskal) - 최소 신장 트리(MST)
크루스칼(Kruskal) - 최소 신장 트리(MST)
개념 신장 트리(Spanning Tree) 모든 정점을 포함하면서 사이클이 없는 그래프 특징 원 그래프의 모든 정점을 포함 간선(node) 수 = 정점 수 - 1 노드 간 사이클을 형성하지 않음 한 그래프 내에서 여러
l1m3kun.tistory.com
코드
def find_set(x):
while x != rep[x]:
x = rep[x]
return x
def union(x, y):
rep[find_set(y)] = find_set(x)
for test_case in range(1, int(input())+1):
V, E = map(int, input().split())
graph = []
for _ in range(E):
# n1, n2, w = map(int, input().split())
graph.append(list(map(int, input().split())))
# make_set
rep = [i for i in range(V+1)]
# 가중치 순으로 정렬
graph.sort(key=lambda x:x[2])
cnt = 0
val = 0
for n1, n2, w in graph:
if find_set(n1) != find_set(n2):
val += w
cnt += 1
union(n1, n2)
if cnt == V:
break
print(f'#{test_case} {val}')
반응형
'Algorithm > SW Expert Academy Review' 카테고리의 다른 글
2607. 비슷한 단어 (0) | 2024.01.20 |
---|---|
13994. 새로운 버스 노선 (0) | 2023.03.06 |
4613. 러시아 국기 같은 깃발 (0) | 2023.03.06 |
1210. [S/W 문제해결 기본] 2일차 - Ladder1 (0) | 2023.03.06 |
1954. 달팽이 숫자 (0) | 2023.03.06 |