APS/백준
[1197] 최소 스패닝 트리 C++
문래동까마귀
2022. 3. 15. 23:56
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
vector<pair<int, pair<int, int>>> vec;
int boss[10001];
int findBoss(int a) {
if (boss[a] == a)
return a;
else
return boss[a] = findBoss(boss[a]);
}
void setUnion(int a, int b) {
a = findBoss(a);
b = findBoss(b);
if (a != b)
boss[b] = a;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int V, E;
cin >> V >> E;
for (int i = 0; i < E; i++) {
int a, b, c;
cin >> a >> b >> c;
vec.push_back(make_pair(c, make_pair(a, b)));
}
sort(vec.begin(), vec.end());
for (int i = 1; i <= V; i++) {
boss[i] = i;
}
int result = 0;
for (int i = 0; i < E; i++) {
int a = vec[i].second.first;
int b = vec[i].second.second;
if (findBoss(a) != findBoss(b)) {
setUnion(a, b);
result += vec[i].first;
}
}
cout << result;
return 0;
}