알고리즘/백준(BOJ)
백준 1197 최소 스패닝 트리
오뚜깅
2021. 5. 5. 19:02
반응형
방금 프로그래머스에서 풀어본 방식인 크루스칼 알고리즘으로 풀어보았다.
여기서 좀 헷갈렸고, 놓쳤던 부분은 parent를 설정할 때 정점이 1부터 시작한다는 것으로 생각해야하고,
그래서 V + 1 사이즈로 초기화해야한다.
// MST(Minimum Spanning Tree)
// 최소 신장 트리는 두 종류 알고리즘으로 풀 수 있다.
// 크루스칼 알고리즘 VS 프림 알고리즘
// 크루스칼 알고리즘은 간선을 선택하며 찾는 알고리즘
// 프림 알고리즘은 정점을 선택하며 찾는 알고리즘이다.
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
long long V, E;
long long getRoot(vector<long long>& parent, long long x) {
if (parent[x] == x) return x;
return parent[x] = getRoot(parent, parent[x]);
}
void unionParent(vector<long long>& parent, long long a, long long b) {
a = getRoot(parent, a);
b = getRoot(parent, b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
bool find(vector<long long>& parent, long long a, long long b) {
a = getRoot(parent, a);
b = getRoot(parent, b);
if (a == b) return true;
else return false;
}
bool compare(vector<long long> a, vector<long long> b) {
return a[2] < b[2];
}
int main() {
scanf("%lld %lld", &V, &E);
vector<vector<long long>> costs;
// Costs Initialize
for (long long e = 0; e < E; ++e) {
vector<long long> temp;
long long A, B, C;
scanf("%lld %lld %lld", &A, &B, &C);
temp.push_back(A);
temp.push_back(B);
temp.push_back(C);
costs.push_back(temp);
}
sort(costs.begin(), costs.end(), compare);
// Parent Initialize
vector<long long> parent(V + 1);
for (long long i = 1; i <= V; ++i) {
parent[i] = i;
}
int answer = 0;
for (long long i = 0; i < costs.size(); ++i) {
if (!find(parent, costs[i][0], costs[i][1])) {
unionParent(parent, costs[i][0], costs[i][1]);
answer += costs[i][2];
}
}
printf("%d", answer);
return 0;
}
반응형