[BaekJoon] 1197번 : 최소 스패닝 트리

Updated:

1197번 : 최소 스패닝 트리


아직 그래프 탐색 알고리즘에 대해 정확히 알지 못 한다는 사실을 알게 되었다..

프로그래머스 스킬 체크 레벨 3 을 푸는데 최소 신장 트리를 만들지 못해 탈락했다.

어떤 문제의 유형에서 최소 신장 트리를 만들어야 하냐면 그래프 내의 모든 정점을 최단거리로 잇고 싶은 경우 만든다.

MST 를 만드는 알고리즘은 두 가지가 있는데 크루스칼, 프림 알고리즘이 있다.

간선의 개수가 노드의 개수보다 많은 경우 프림을 사용한다.

이 문제에서는 크루스칼을 사용했다.

크루스칼은 사이클을 만들지 않으면서 가장 작은 무게를 가진 간선을 계속 연결시켜 나가는 것이다.

처음에는 사이클 판별을 리스트로 했다가 시간초과가 발생해 사전으로 처리 해주었다.


import sys


def solution():
	global edge_info
	edge_info.sort(key=lambda x: x[2])
	answer = 0
	connection = {i: 0 for i in range(1, V + 1)}
	connection[1] = 1
	connection_len = 1

	while connection_len != V:
		for idx, edge in enumerate(edge_info):
			if connection[edge[0]] >= 1 and connection[edge[1]] >= 1:
				continue

			if connection[edge[0]] >= 1 or connection[edge[1]] >= 1:
				answer += edge[2]
				connection_len += 1
				connection[edge[0]] += 1
				connection[edge[1]] += 1
				edge_info.pop(idx)
				break

	return answer


if __name__ == "__main__":
	V, E = map(int, input().split())
	edge_info = [list(map(int, sys.stdin.readline().rsplit())) for _ in range(E)]

	print(solution())



Categories:

Updated:

Leave a comment