【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; }
浙公网安备 33010602011771号