여름의 서재
[백준] 1197_최소 스패닝 트리 (prim 이용) 본문
728x90
📕 문제
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
💡 풀이법
1. 간선의 정보들을 edges에 담는다.
2. visited 리스트는 노드들의 방문 처리를 할 리스트이다.
3. 1을 넣고 find_MST 함수를 실행시킨다.
4. 1을 방문처리해주고 1과 인접한 노드들을 candidate 리스트로 만든다.
5. candidate를 heap 구조로 만들어준다. ( 가장 가중치가 작은 간선을 꺼내기 위해)
6. candidate에서 하나를 pop해서 방문하지 않았다면 방문처리를 해주고 ans에 가중치를 더해준다.
7. 위에서 뺀 노드와 인접한 노드들을 확인하면서 방문하지 않았다면 candidate에 넣어준다.
import heapq
from collections import defaultdict
def find_MST(s):
global ans
visited[s] = 1
candidate = edges[s]
heapq.heapify(candidate)
while candidate:
w, n = heapq.heappop(candidate)
if not visited[n]:
visited[n] = 1
ans += w
for edge in edges[n]:
if not visited[edge[1]]:
heapq.heappush(candidate, edge)
V, E = map(int, input().split())
edges = defaultdict(list)
for _ in range(E):
n1, n2, w = map(int, input().split())
edges[n1].append((w, n2))
edges[n2].append((w, n1))
visited = [0] * (V+1)
ans = 0
find_MST(1)
print(ans)
'알고리즘 > BOJ' 카테고리의 다른 글
[백준] 3190_뱀 (0) | 2021.10.30 |
---|---|
[백준] 16926_배열 돌리기1 (0) | 2021.10.25 |
[백준] 1717_집합의 표현 (disjoint set 이용) (0) | 2021.10.20 |
[백준] 17144_미세먼지 안녕! (0) | 2021.10.20 |
[백준] 17070_파이프 옮기기1 (DFS & DP 이용) (0) | 2021.10.13 |
Comments