- toc {:toc}
๐ฆ1197: MST
[์๊ณ ๋ฆฌ์ฆ ํ์ด] ๊ฐ๋๊ท
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-18
๋ฌธ์ ํ์ธํ๊ธฐ
ํ์ด
- Union Find ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ์ต์๊ฐ์ ์๊ณ ์ถ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์ ์ ์์๋๋ก ๋์ดํ๋ค.
- ์์์ ๊ณผ ๋์ ์ ๋ถ๋ชจ๋ฅผ ์ฐพ์ ๋น๊ตํ๊ณ , ๋ถ๋ชจ๊ฐ ์๋ก ๋ค๋ฅด๋ฉด(์๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์๋ค๋ฉด) ์ฐ๊ฒฐํ๋ค.
- ์ด๋ฅผ ๋ชจ๋ ๊ฐ์ ์ ๋ํด ํ์ธํ๋ฉด ์ต์ ์คํจ๋ ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๋ค.
#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
#define endl '\n'
using namespace std;
int V, E, A, B, C;
int parent[10001];
int res = 0;
vector<tuple<int, int, int>> graph;
int Find(int x){
if (parent[x] == x) return x;
else return parent[x] = Find(parent[x]);
}
int Union(int i){
int x = get<1>(graph[i]);
int y = get<2>(graph[i]);
x = Find(x);
y = Find(y);
if(x != y){
parent[y] = x;
return get<0>(graph[i]);
}
return 0;
}
void Initialize(){
for(int i=1; i<=V; i++){
parent[i] = i;
}
}
void Input(){
cin >> V >> E;
for(int i=0; i<E; i++){
cin >> A >> B >> C;
graph.push_back(make_tuple(C, A, B));
}
sort(graph.begin(), graph.end());
}
void Solution(){
for(int i=0; i<E; i++){
res += Union(i);
}
cout << res << endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
Input();
Initialize();
Solution();
return 0;
}