Baekjoon Review

[Gold 4] 최소 스패닝 트리

hanseongbugi 2024. 11. 9. 14:52

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

 

이 문제는 스패닝 트리를 생성할 때 가중치의 합을 구하면 된다.

 

스패닝 트리는 크루스칼 알고리즘을 사용해 구현하였다.

union - find를 사용해 스패닝 트리를 생성할 수 있었다.

 

부모가 같지 않다는 것은 스패닝 트리를 만들 수 있는 조건에 해당하기 때문에

answer에 가중치를 누적하면 된다.

 

부모가 같지 않는지 확인하는 것은 find함수를 사용한다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int V, E;
int parent[10001];
vector<pair<int,pair<int,int>>> costs;
int answer = 0;

int find(int x) {
	if (parent[x] == x)return x;
	else return parent[x] = find(parent[x]); 
}
void uni(int x, int y) {
	x = find(x); 
	y = find(y); 
	parent[y] = x; 
}
bool isSame(int x, int y) {
	x = find(x); 
	y = find(y); 
	if (x == y)return true;
	else return false; 
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin>>V>>E;

    int A, B, C;
    for(int i = 0;i<E;i++){
        cin>>A>>B>>C;
        costs.push_back({C, {A,B}});
    }
    sort(costs.begin(), costs.end());
    for(int i = 1;i<=V;i++)
        parent[i] = i;
    
    for(int i = 0;i<costs.size();i++){
        if(!isSame(costs[i].second.first, costs[i].second.second)){
            uni(costs[i].second.first, costs[i].second.second);
            answer += costs[i].first;
        }
    }
    cout<<answer;
}