백준 1197번 최소 스패닝 트리

tiki·2021년 6월 3일
0

백준

목록 보기
19/30

백준 1197번 최소 스패닝 트리

출처 : https://www.acmicpc.net/problem/1197

코드

import sys
from heapq import heappop, heappush

V, E = map(int, sys.stdin.readline().split())

def solve():
  connected  = [] 
  graph = {i : [] for i in range(1, V+1)}
  answer = 0
  for _ in range(E):
    a, b, cost = map(int, sys.stdin.readline().split())
    graph[a].append([b, cost])
    graph[b].append([a, cost])
  
  connected.append(1)
  queue = []
  for node, cost in graph[1]:
    heappush(queue, [cost, node])
  
  while queue:
    cost, node = heappop(queue)
    if node not in connected:
      answer+= cost
      for n, c in graph[node]:
        heappush(queue, [c, n])
        
      connected.append(node)
  
  print(answer)  

solve()

문제풀이 아이디어

이 문제에서는 최소 신장 트리 알고리즘이 사용된다. 그중에서도 프림알고리즘을 활용하여 문제를 풀었다.

프림 알고리즘을 전개할 때 우선순위 큐를 활용하여 간선의 가중치의 최소를 선택할 수 있는 방법을 해결하였다.

최소 신장 트리란?

  • 신장트리 == 스패닝 트리

  • 최소 신장트리 == MST

  • 각 간선의 가중치가 일정하지 않을 때 각 노드들을 모두 연결할 때 가중치의 합이 가장 적은 경로를 찾는 것

MST의 종류

1. 크루스칼 알고리즘(간선 선택을 기반)

탐욕적인 방법(greedy method)을 이용하여 모든 노드들을 최소 비용으로 연결하는 최적 해답을 구하는 것

이전 단계에서 만들어진 신장 트리와는 상관없이 무조건 최소 간선만을 선택하는 방법이다. -> 간선을 기준으로 선택

<알고리즘 흐름>

  • 그래프의 간선들을 가중치의 오름차순으로 정렬한다.

  • 정렬된 간선 리스트에서 순서대로 사이클을 형성하지 않는 간선을 선택한다.

  • 해당 간선을 현재의 MST(최소 비용 신장 트리)의 집합에 추가한다.

2. 프림 알고리즘(노드 선택을 기반)

시작 정점에서부터 출발하여 신장트리 집합을 단계적으로 확장 해나가는 방법

이전 단계에서 만들어진 신장 트리를 확장하는 방법이다. -> 노드를 기반으로 선택

<알고리즘 흐름>

  • 시작 단계에서는 시작 노드만이 MST 집합에 포함된다.

  • 앞 단계에서 만들어진 MST 집합에 인접한 노드들 중에서 최소 간선으로 연결된 노드을 선택하여 트리를 확장한다.

  • 위의 과정을 노드들이 모두 연결될 때까지 진행한다.

profile
하루하루 조금씩 발전하려는 개발자 입니다.

0개의 댓글

관련 채용 정보