hdu 1233 还是畅通工程

/*还是畅通工程



Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 27849    Accepted Submission(s): 12415





Problem Description

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

 



Input

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。

当N为0时,输入结束,该用例不被处理。

 



Output

对每个测试用例,在1行里输出最小的公路总长度。

 



Sample Input

3

1 2 1

1 3 2

2 3 4

4

1 2 1

1 3 4

1 4 1

2 3 3

2 4 2

3 4 5

0

 



Sample Output

3

5



Hint

Hint

 

Huge input, scanf is recommended.

 



Source

浙大计算机研究生复试上机考试-2006年

 

*/

//Kruscal | Prim



#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

const int maxn = 5000 + 50;

int w[maxn], v[maxn], u[maxn], p[maxn], r[maxn];

int n, m;

void init()

{

    memset(u, 0, sizeof(u)); memset(v, 0, sizeof(v)); memset(r, 0, sizeof(r));

    memset(p, 0, sizeof(p)); memset(w, 0, sizeof(w));

}



int cmp(const int i, const int j)

{

    return w[i] < w[j];

}

int find(int x)

{

    x == p[x] ? x : p[x] = find(p[x]);

}

int Kruscal()

{

    int ans = 0;

    for(int i = 0; i < n; i++) p[i] = i;

    for(int i = 0; i < m; i++) r[i] = i;

    sort(r, r+m, cmp);

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

        int e = r[i];

        int x = find(u[e]), y = find(v[e]);

        if(x != y){

            ans += w[e];

            p[x] = y;

        }

    }

    return ans;

}



int main()

{

    while(~scanf("%d", &n) && n){

        m = n*(n-1)/2;

        init();

        for(int i = 0; i < m; i++)

            scanf("%d%d%d", &u[i], &v[i], &w[i]);

        int cnt = Kruscal();

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

    }

    return 0;

}

 

你可能感兴趣的:(HDU)