Newguy


私信TA

用户名:772007765

访问量:88802

签 名:

已秃人士

等  级
排  名 29
经  验 15363
参赛次数 3
文章发表 92
年  龄 0
在职情况 在职
学  校
专  业

  自我简介:

TA的其他文章

描述

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

输入

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

输出

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

样例输入1

8
1 2 42
1 3 68
1 4 35
1 5 1
1 6 70
1 7 25
1 8 79
2 3 59
2 4 63
2 5 65
2 6 6
2 7 46
2 8 82
3 4 28
3 5 62
3 6 92
3 7 96
3 8 43
4 5 28
4 6 37
4 7 92
4 8 5
5 6 3
5 7 54
5 8 93
6 7 83
6 8 22
7 8 17
0

样例输出1

82

#include <stdio.h>             //并查集+快排+最小生成树
#include <stdlib.h>
typedef struct {
	int x;
	int y;
	int len;
} Node;
Node road[100];
int cmp(const void *a,const void *b)   //升序
{
	return ((Node *)a)->len-((Node *)b)->len;
}
int main()
{
	int n;
	while (scanf("%d",&n)!=EOF&&n)
	{
		int i,flag[100]={0},sum,min=0;    //flag用于标记根节点是否已经访问过
		sum=n*(n-1)/2;             
		for (i=0;i<sum;i++)
			scanf("%d%d%d",&road[i].x,&road[i].y,&road[i].len);
		qsort(road,sum,sizeof(Node),cmp);            //快排就是方便
		for (i=1;i<=n;i++)
			flag[i]=1;                                 //初始化根节点
		flag[road[0].x]=0;                                 
		for (i=0;i<sum;i++)
		{
			int cheak=flag[road[i].x]+flag[road[i].y];
			if (cheak==1)
			{
				min+=road[i].len;
				flag[road[i].x]=0;
				flag[road[i].y]=0;
				i=0;
			}
		}
		printf("%d\n",min);
	}
	return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »