还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13192    Accepted Submission(s): 6030


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
View Code
 1 #include<iostream>
 2 int map[101][101],visit[101],dis[101];
 3 
 4 int prim(int n)
 5 {
 6     int i,j,k,min,sum=0;
 7     memset(visit,0,sizeof(visit));
 8     for(i=1;i<=n;++i)
 9         dis[i]=map[1][i];
10     visit[1]=1;
11     for(i=1;i<n;++i)
12     {
13         k=1;
14         min=0x7fffffff;
15         for(j=1;j<=n;++j)
16         {
17             if(!visit[j]&&min>dis[j])
18             {
19                 min=dis[j];
20                 k=j;
21             }
22         }
23         visit[k]=1;
24         sum+=min;
25         for(j=1;j<=n;++j)
26         {
27             if(!visit[j]&&map[k][j]<dis[j])
28                 dis[j]=map[k][j];
29         }
30     }
31     return sum;
32 }
33 
34 int main()
35 {
36     using namespace std;
37     int n,s,e,d;
38     while(cin>>n,n)
39     {
40         for(int i=1;i<=n*(n-1)/2;++i)
41         {
42             cin>>s>>e>>d;
43             map[s][e]=map[e][s]=d;
44         }
45         cout<<prim(n)<<endl;
46     }
47     return 0;
48 }

 

 
posted on 2012-06-30 23:19  可笑痴狂  阅读(316)  评论(0)    收藏  举报