새소식

Algorithm

최소 스패닝 트리

  • -

C++

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

typedef struct Edge_t Edge;

struct Edge_t {
    int from, to, weight;
    bool operator < (const Edge a) const {
        return weight < a.weight;
    }
};

int r[10001];
int s[10001];

int Find(int i) {
    if (r[i] == i) return i;
    else {
        r[i] = Find(r[i]);
        return r[i];
    }
}

void Union(int i, int j) {
    int I = Find(i), J = Find(j);
    if (s[I] > s[J]) {
        r[J] = I;
    } else if (s[I] < s[J]) {
        r[I] = J;
    } else {
        r[J] = I;
        s[I]++;
    }
}

int main(int argc, const char * argv[]) {
    
    int V, E;
    scanf("%d%d", &V, &E);
    
    vector<Edge> e;
    for (int i = 0; i < E; i++) {
        int A, B, C;
        scanf("%d%d%d", &A, &B, &C);
        e.push_back({A, B, C});
    }
    
    for (int i = 1; i <= V; i++) {
        r[i] = i;
        s[i] = 1;
    }
    
    sort(e.begin(), e.end());
    
    int count = 0;
    int answer = 0;
    for (vector<Edge>::iterator it = e.begin(); it != e.end(); it++) {
        if (Find(it->from) != Find(it->to)) {
            Union(it->from, it->to);
            count++;
            answer += it->weight;
            if (count == V-1) break;
        }
    }

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

 

반응형

'Algorithm' 카테고리의 다른 글

BFS  (0) 2023.08.03
다익스트라  (0) 2019.06.20
인덱스 트리  (0) 2019.06.20
스택, 큐, 데큐, 힙  (0) 2019.06.20
빠른 입출력  (0) 2019.06.20
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.