1. 아이디어
▪ 간선을 인접리스트에 넣기
▪ heap에 시작점 (0,1) 추가하기
▪ heap이 빌때까지 노드를 꺼내서 다음을 반복
- 힙의 최소값을 꺼내고, 해당 노드를 방문하지 않았으면
- 방문여부 갱신
- 가중치 합 갱신
- 방문하지 않은 간선들 heap에 추가
2. 시간복잡도
▪ O(ElogE)
3. 변수
▪ 간선의 정보를 저장할 인접리스트 (가중치,다음노드): (int,int)[][]
▪ 방문 여부: bool[]
▪ 가중치의 합: int
▪ (가중치,노드)를 저장할 heap
4. 오답노트
▪ 인접 리스트 만들때 양방향으로 만들어야함
Code
import sys import heapq input = sys.stdin.readline V,E = map(int, input().split()) edges = [[] for _ in range(V+1)] for _ in range(E): a,b,c = map(int, input().split()) edges[a].append([c,b]) edges[b].append([c,a]) # 오답노트 chk = [False]*(V+1) weight_sum = 0 heap = [[0,1]] while heap: w, node = heapq.heappop(heap) if chk[node] == False: chk[node] = True weight_sum += w for next_edge in edges[node]: if chk[next_edge[1]] == False: heapq.heappush(heap,next_edge) print(weight_sum)
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
'코딩테스트' 카테고리의 다른 글
| [코딩테스트] 백준 11404번: 플로이드 (0) | 2024.03.08 |
|---|---|
| [코딩테스트] 백준 1753번: 최단경로 (1) | 2024.03.08 |
| [코딩테스트] 백준 11726번: 2×n 타일링 (0) | 2024.03.08 |
| [코딩테스트] 백준 11047번: 동전 0 (0) | 2024.03.08 |
| [코딩테스트] 백준 2559번: 수 찾기 (0) | 2024.03.08 |