Algorithm/BOJ

[백준] 1922번 네트워크 연결

면빈이 2020. 1. 10. 21:55

[적용한 알고리즘]

MST(최소 신장 트리, 미니멈 스패닝 트리, 최소 스패닝 트리..)

 

[아이디어]

기본 문제라고 한다. 항상 그렇듯 출처는 kks 님의 블로그

 

[교훈]

Edge 를 정의한 방식이 싱기방기하다.

공부를 더해야겠다.

 

<코드>

#include <cstdio>
#include <algorithm>
using namespace std;

int UF[1001];

int find(int a){
    if (UF[a] < 0) return a;
    return UF[a] = find(UF[a]);
}

bool merge(int a, int b){
    a = find(a);
    b = find(b);

    if (a == b) return false;
    UF[b] = a;
    return true;
}

struct Edge{
    int u, v, w;
    Edge(): Edge(-1, -1, 0){}
    Edge(int u1, int v1, int w1): u(u1), v(v1), w(w1){}
    bool operator < (const Edge& O) const {
        return w < O.w;
    }
};
int main(){
    int N, M;
    scanf("%d %d", &N, &M);
    Edge e[100001];

    for (int i = 0; i < M; i++){
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        e[i] = Edge(a - 1, b - 1, c);
    }
    sort(e, e + M);

    int result = 0;
    int cnt = 0;
    fill(UF, UF + N, -1);
    for (int i = 0;; i++){
        if (merge(e[i].u, e[i].v)){
            result += e[i].w;
            if (++cnt == N - 1) break;
        }
    }

    printf("%d\n", result);
    return 0;
}