• 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;
}