【HDOJ】1233 还是畅通工程

并查集的典型应用——最小生成树,kruskal算法。

#include <stdio.h>
#include <stdlib.h>

#define MAXNUM 5000
#define MAXN   1005
typedef struct {
    int from, to;
    int val;
} info_st;

info_st path[MAXNUM];
int root[MAXN];
int num;

int comp(const void *a, const void *b) {
    return ((info_st *)a)->val - ((info_st *)b)->val;
}

int find(int a) {
    int r = a;

    while (r!=root[r])
        r = root[r];

    return r;
}

void join(int from, int to, int val) {
    int x = find(from);
    int y = find(to);
    if (x != y) {
        num += val;
        root[y] = x;
    }
}

int main() {
    int n;
    int i, len;

    while (scanf("%d", &n)!=EOF && n) {
        for (i=0; i+i<n*(n-1); ++i)
            scanf("%d %d %d", &path[i].from, &path[i].to, &path[i].val);
        len = i;
        qsort(path, len, sizeof(info_st), comp);
        // init
        num = 0;
        for (i=1; i<=n; ++i)
            root[i] = i;
        for (i=0; i<len; ++i)
            join(path[i].from, path[i].to, path[i].val);
        printf("%d\n", num);
    }

    return 0;
}

 

posted on 2014-03-21 17:26  Bombe  阅读(146)  评论(0)    收藏  举报

导航