hdu 1233(还是畅通工程)

hdu 1233(还是畅通工程)
 1  /*
 2  Author:    Leo.W
 3  Descriptipn:    给定几个顶点以及各顶点间的距离,求连接所有顶点的所需的最短距离。
 4  How to Do:    基础的最小生成树问题。易知此为稠密图,故使用普里姆算法解题。
 5     */
 6 #include <iostream>
 7 #include <stdio.h>
 8 #include < string.h>
 9  using  namespace std;
10 
11  #define MAXSIZE 100
12  int closePath[MAXSIZE];
13  int path[MAXSIZE][MAXSIZE];
14  bool chose[MAXSIZE];
15  int n; // 顶点数
16 
17  int prim( int a){
18     chose[a]= true;
19      int i,sum=0,num=n-1,pos=a;
20      for(i=1;i<=n;i++)    closePath[i]=path[a][i];
21      while(num){
22          int mins=10000000;
23          for(i=1;i<=n;i++){
24              if(!chose[i]&&closePath[i]<mins){
25                 mins=closePath[i];
26                 pos=i;
27             }
28         }
29         num--;    sum+=mins;
30         chose[pos]= true;
31          for(i=1;i<=n;i++){
32              if(!chose[i]&&closePath[i]>path[pos][i]){
33                 closePath[i]=path[pos][i];
34             }
35         }
36     }
37      return sum;
38 }
39  int main(){
40      // freopen("in.txt","r",stdin); 
41       while(scanf("%d",&n),n){
42          if(n==1)    printf("0\n");
43          else{
44             memset(chose, false,MAXSIZE);
45              int i,j,pathSum=n*(n-1)/2;
46              for(i=1;i<=n;i++){
47                  for(j=1;j<=n;j++){
48                      if(i==j)    path[i][j]=0;
49                      else    path[i][j]=10000000;
50                 }
51             }
52              for(i=1;i<=pathSum;i++){
53                  int begin,end,len;
54                 scanf("%d%d%d",&begin,&end,&len);
55                  if(len<path[begin][end])
56                     path[begin][end]=path[end][begin]=len;
57             }
58             printf("%d\n",prim(1));
59         }    
60     }
61      return 0; 
62 } 

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