HDU 1233 还是畅通工程

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


 

方法:最小生成树。

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

struct point
{
    int u,v;
    int w;
}num[5008];

int p[102], n,i,sum,x,y;;

int cmp(const void *a,const void *b)
{
    struct point *c,*d;
    c=(struct point *)a;
    d=(struct point *)b;
    return c->w - d->w;
};

int root(int x)
{
    if(x==p[x])
    {
        return x;
    }
   return p[x]=root(p[x]);
};

int Kruskal()
{
    int i;
    for(i=0;i<=n;i++)
    {
        p[i]=i;
    }
    qsort(num,n*(n-1)/2,sizeof(num[0]),cmp);
    sum=0;
    for(i=0;i<n*(n-1)/2;i++)
    {
		x = root(num[i].u);
		y = root(num[i].v);
		if(x!=y)
		{
			sum+=num[i].w;
			p[x]=y;
		}
    }
    return sum;
}


int main()
{
    while(scanf("%d",&n),n)
    {
        for(i=0;i<n*(n-1)/2;i++)
        {
            scanf("%d%d%d",&num[i].u,&num[i].v,&num[i].w);
        }
        Kruskal();
        printf("%d\n",sum);
    }
    return 0;
}


 

你可能感兴趣的:(HDU 1233 还是畅通工程)