【最小生成树】还是畅通工程

还是畅通工程

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


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
 
Huge input, scanf is recommended.
 
Source
代码:(Prim+堆排序,2015.8.17
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <queue>
 5 #include <algorithm>
 6 #define MAX 100100
 7 using namespace std;
 8 int First[MAX];
 9 int Sign;/*记录边编号*/
10 struct Poin
11 {
12     int to,v,next;
13     friend bool operator<(Poin a,Poin b)
14     {
15         return a.v>b.v;
16     }
17 }ID[MAX*3];
18 void Cread(int N){for(int i=0;i<=N;i++)First[i]=0;Sign=1;}/*初始化*/
19 void Add_E(int x,int y,int z)
20 {
21     ID[Sign].to=y;
22     ID[Sign].v=z;
23     ID[Sign].next=First[x];
24     First[x]=Sign++;
25 }
26 
27 int Prim(int N)/*Prim+堆维护*/
28 {
29     priority_queue <Poin>Q;
30     Poin NUM;
31     int P=1,i,Sum=0,Vis[MAX]={0};
32     Vis[P]=1;N--;
33     for(i=First[P];i;i=ID[i].next){Q.push(ID[i]);}
34     while(!Q.empty()&&N)
35     {
36         NUM=Q.top();Q.pop();
37         if(!Vis[NUM.to])
38         {
39             P=NUM.to;Vis[P]=1;
40             Sum+=NUM.v;N--;
41             for(i=First[P];i;i=ID[i].next)
42                 Q.push(ID[i]);
43         }
44     }
45     if(!N)return Sum;
46     else return -1;
47 }
48 int main()
49 {
50 
51     int N,M,i,A,B,C,SUM;
52     while(scanf("%d",&N)!=EOF)
53     {
54         M=N*(N-1)/2;
55         if(N==0)break;
56         Cread(N);
57         for(i=0;i<M;i++)
58         {
59             scanf("%d%d%d",&A,&B,&C);
60             Add_E(A,B,C);Add_E(B,A,C);
61         }
62         SUM=Prim(N);
63         if(SUM!=-1)printf("%d\n",SUM);
64         else printf("?\n");
65     }
66     return 0;
67 }
View Code

 

 代码详细参考畅通工程:http://www.cnblogs.com/LWF5201314614/articles/3929305.html

posted @ 2015-06-08 22:22  Wurq  阅读(103)  评论(0编辑  收藏  举报