๐ ์ ์ฅํธ๋ฆฌ(Spanning Tree) : ํ๋์ ๊ทธ๋ํ๊ฐ ์์ ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๋ถ๋ถ ๊ทธ๋ํ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ : ์ ์ฅ ํธ๋ฆฌ ์ค์์ ์ต์ ๋น์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ, Union-FInd๋ฅผ ์ด์ฉ
1) ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น์ฉ์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
2) ๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉฐ ํ์ฌ์ ๊ฐ์ ์ด ์ฌ์ดํด์ ๋ฐ์์ํค๋์ง ํ์ธํ๋ค.
2-1) ์ฌ์ดํด ๋ฐ์ํ์ง ์๋ ๊ฒฝ์ฐ : ์ต์ ์ ์ฅํธ๋ฆฌ์ ํฌํจ์ํจ๋ค.
2-2) ์ฌ์ดํด์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ : ์ต์ ์ ์ฅํธ๋ฆฌ์ ํฌํจ์ํค์ง ์๋๋ค.
3) ๋ชจ๋ ๊ฐ์ ์ ๋ํ์ฌ 2๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;
// ๋
ธ๋์ ๊ฐ์(v)์ ๊ฐ์ (e)์ ๊ฐ์
// ๋
ธ๋์ ๊ฐ์๋ ์ต๋ 100000๊ฐ๋ผ๊ณ ๊ฐ์
int v, e;
int parent[100001];
// ํน์ ์์๊ฐ ์ํ ์งํฉ์ ์ฐพ๊ธฐ
int findParent(int x) {
if (parent[x] != x) {
parent[x] = findParent(parent[x]);
}
return parent[x];
}
// ๋ ์์๊ฐ ์ํ ์งํฉ์ ํฉ์น๊ธฐ
void unionParent(int x, int y) {
x = findParent(x);
y = findParent(y);
if (x < y) {
parent[y] = x;
}
else {
parent[x] = y;
}
}
int main(void) {
vector<tuple<int, int, int> > edge;
cin >> v >> e;
// ๋ถ๋ชจํ
์ด๋ธ ์์์, ๋ถ๋ชจ๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ด๊ธฐํ
for (int i = 1; i <= v; i++) {
parent[i] = i;
}
// union ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํ
for (int i = 0; i < e; i++) {
int a, b, d;
cin >> a >> b >> d;
edge.push_back(make_tuple(d, a, b));
}
// ๊ฐ์ ๊ฑฐ๋ฆฌ๋ณ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
sort(edge.begin(), edge.end()); // greater<int>()
int sum = 0;
for (auto t : edge) {
int a, b, d;
tie(d, a, b) = t;
if (findParent(a) != findParent(b)) {
unionParent(a, b);
sum += d;
}
}
cout << sum << endl;
return 0 ;
}
๐ ์ ์์ฌํญ : template์์ ์ฌ์ฉํ tuple์ c++11๋ฒ์ ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
'์๊ณ ๋ฆฌ์ฆ > Template' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm][Template] ์์์ ํ๋ณ (0) | 2022.01.20 |
---|---|
[Algorithm][Template] ์์ ์ ๋ ฌ(Topology Sort) (0) | 2022.01.15 |
[Algorithm][Template] ์๋ก์ ์งํฉ(Disjoint Set), Union-Find (0) | 2022.01.02 |
[Algorithm][Template] ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ (0) | 2021.12.29 |
[Algorithm][Template] Dijkstra ์ต๋จ๊ฑฐ๋ฆฌ ํ์ (0) | 2021.12.18 |