๐ PS/Algorithm
[Baekjoon] 1197๋ฒ: ์ต์ ์คํจ๋ ํธ๋ฆฌ
hades1
2024. 9. 2. 18:36
๐ฅ ๋ฌธ์
https://www.acmicpc.net/problem/1197
๐ ์ค๊ณ
๋จ์ํ, ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๋ฌธ์ ์ด๋ค.
์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๋ณต๊ธฐํด๋ณด์.
1. ๊ฐ์ ์ ๋ณด๋ฅผ ๋น์ฉ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. ๋ณธ์ธ์ ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์๋ค.
2. ์ฐ์ ์์ ํ์์ ํ๋์ฉ ๊บผ๋ด์(= ๋น์ฉ์ด ์์ ๊ฐ์ฐ๋ถํฐ) ๋ ์ ์ ์ ์ฐ๊ฒฐ ์๋ํ๋ค. ๋ ์ ์ ์ ๋ถ๋ชจ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ, ์ด๋ฏธ ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๋ป์ด๋ฏ๋ก ๋์ด๊ฐ๋ค. ๋ ์ ์ ์ ๋ถ๋ชจ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ, ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก union์ ํตํด ์ฐ๊ฒฐํ๊ณ ๊ฐ์ค์น์ ๋น์ฉ์ ์ถ๊ฐํ๋ค.
๐ ํ์ด
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int v, e, a, b, c, result = 0;
vector<int> parent(10001);
priority_queue<vector<int>, vector<vector<int>>, greater<vector<int>>> edges;
int find_parent(int x) {
if (parent[x] != x) {
return find_parent(parent[x]);
}
return x;
}
void union_parent(int a, int b) {
if (a > b) {
parent[b] = a;
}
else {
parent[a] = b;
}
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> v >> e;
for (int i = 1; i <= v; i++) {
parent[i] = i;
}
for (int i = 0; i < e; i++) {
cin >> a >> b >> c;
edges.push({ c, a, b });
}
while (!edges.empty()) {
int c = edges.top()[0];
int a = edges.top()[1];
int b = edges.top()[2];
edges.pop();
a = find_parent(a);
b = find_parent(b);
if (a != b) {
union_parent(a, b);
result += c;
}
}
cout << result << "\n";
return 0;
}