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