[Gold IV] Title: 최소 스패닝 트리, Time: 244 ms, Memory: 53972 KB -BaekjoonHub

This commit is contained in:
SSUM
2025-03-02 20:53:17 +09:00
parent 580de5070e
commit f58de3124c
2 changed files with 75 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
# [Gold IV] 최소 스패닝 트리 - 1197
[문제 링크](https://www.acmicpc.net/problem/1197)
### 성능 요약
메모리: 53972 KB, 시간: 244 ms
### 분류
최소 스패닝 트리, 그래프 이론
### 제출 일자
2025년 3월 2일 20:53:06
### 문제 설명
<p>그래프가 주어졌을 때, 그 그래프의 최소 스패닝 트리를 구하는 프로그램을 작성하시오.</p>
<p>최소 스패닝 트리는, 주어진 그래프의 모든 정점들을 연결하는 부분 그래프 중에서 그 가중치의 합이 최소인 트리를 말한다.</p>
### 입력
<p>첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 가중치 C인 간선으로 연결되어 있다는 의미이다. C는 음수일 수도 있으며, 절댓값이 1,000,000을 넘지 않는다.</p>
<p>그래프의 정점은 1번부터 V번까지 번호가 매겨져 있고, 임의의 두 정점 사이에 경로가 있다. 최소 스패닝 트리의 가중치가 -2,147,483,648보다 크거나 같고, 2,147,483,647보다 작거나 같은 데이터만 입력으로 주어진다.</p>
### 출력
<p>첫째 줄에 최소 스패닝 트리의 가중치를 출력한다.</p>

View File

@@ -0,0 +1,43 @@
import sys
import math
from collections import deque
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
V, E = map(int, input().split())
a = []
uf_arr = [0]
distance = 0
for i in range(1, V+1):
uf_arr.append(i)
def find(a):
if(a==uf_arr[a]):
return a
else:
uf_arr[a] = find(uf_arr[a])
return uf_arr[a]
def union(a,b):
a = find(a)
b = find(b)
if(a!=b):
uf_arr[b] = a
for i in range(E):
s, e, w = map(int, input().split())
a.append((w, s, e)) # 가중치, 시작점, 종료점
a.sort(key=lambda x : x[0])
edge_count = 0
for w, s, e in a:
if(find(s) != find(e)):
union(s, e)
distance += w
edge_count += 1
if edge_count >= V-1:
break
print(distance)