还是畅通工程 hdu1233

来源:互联网 发布:游戏耳机品牌 知乎 编辑:程序博客网 时间:2024/05/21 10:55

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    MemoryLimit: 65536/32768 K (Java/Others)
Total Submission(s): 20561    Accepted Submission(s): 9130


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

 

 

Recommend

JGShining

 



Statistic | Submit | Discuss | Note

#include<stdio.h>#include<string.h>#define INF 0x3f3f3fint n;int map[110][110];int pre(){       intmin,i,j,k,sum,vis[101]={0},low[101];       vis[1]=1;       for(i=1;i<=n;i++)       {              low[i]=map[1][i];       }       for(i=1,sum=0;i<n;i++)       {              min=INF;              k=0;              for(j=1;j<=n;j++)              {                     if(vis[j]==0&&min>low[j])                     {                            min=low[j];                            k=j;                     }              }              sum+=min;              vis[k]=1;              for(j=0;j<=n;j++)              {                     if(vis[j]==0&&low[j]>map[k][j])                     {                            low[j]=map[k][j];                     }              }       }       return sum;} int main(){       intt,i,a,b,p;       while(scanf("%d",&n),n)       {              memset(map,0x3f,sizeof(int)*n*n);              t=n*(n-1)/2;              for(i=0;i<t;i++)              {                     scanf("%d%d %d",&a,&b,&p);                     map[a][b]=map[b][a]=p;              }              printf("%d\n",pre());       }           return0;}


原创粉丝点击