hrbustOJ 最小生成树问题(kruskal)

View Code
/*

  Name: 最小生成树(kruskal) 

  Copyright: 

  Author: Try86

  Date: 15/04/12 08:01

  Description: 

*/



#include <cstdio>

#include <cstdlib>

#include <iostream>



using namespace std;



const int N = 10005;

const int M = 50005;



int p[N], sum;

struct edge {

    int u;

    int v;

    int w;

}e[M];



int cmp(const void *a, const void *b) {

    return (*(edge *)a).w - (*(edge *)b).w;

}



void init(int vs) {

    for (int i=1; i<=vs; ++i) p[i] = i;

    return ;

}



int find(int v) {

    if (p[v] != v) p[v] = find(p[v]);

    return p[v];

}



int join(edge e) {

    int x, y;

    x = find(e.u);

    y = find(e.v);

    if (x != y) {

        ++sum;

        p[x] = y;

        return e.w;

    }

    return 0;

}



int kruskal(int es, int vs) {

    int ans = 0;

    init(vs);

    qsort(e, es, sizeof(edge), cmp);

    sum = 1;

    for (int i=0; i<es; ++i) {

        ans += join(e[i]);

        if (sum == vs) return ans;

    }

    return -1;

}



int main() {

    int n, m;

    while (scanf("%d%d", &n, &m) != EOF) {

        for (int i=0; i<m; ++i) scanf ("%d%d%d", &e[i].u, &e[i].v, &e[i].w);

        int ans = kruskal(m, n);

        printf ("%d\n", ans);

    }

    return 0;

}

 

你可能感兴趣的:(最小生成树)