HDU1863畅通工程(最小生成树 Kruskal)

题目链接

 

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

#define MAXN 5000

int v[MAXN], u[MAXN], p[101], w[MAXN], r[MAXN];

int find(int x){return p[x] == x ? x : (p[x] = find(p[x]));}
int comp(const void *a, const void *b){
    int x = *(int *)a, y = *(int *)b;
    return w[x] - w[y];
}

int main(){
    int n, m, i, s, icount;
    while(scanf("%d", &n) == 1 && n != 0){
        icount = 0; s = 0;
        scanf("%d", &m);
        for(i=0; i<n; i++) scanf("%d %d %d", &v[i], &u[i], &w[i]);
        for(i=1; i<=m; i++) p[i] = i;
        for(i=0; i<n; i++) r[i] = i;
        qsort(r, n, sizeof(r[0]), comp);
        for(i=0; i<n; i++){
            int e = r[i], x = find(v[e]), y = find(u[e]);
            if(x != y){
                s += w[e]; p[x] = y; icount++;
            }
        }
        if(icount < m-1) printf("?\n");
        else printf("%d\n", s);

    }

    return 0;
}

 


posted on 2013-01-28 20:58  Still_Raining  阅读(208)  评论(0编辑  收藏  举报