Jungle Roads(最小生成树计算最短路径)

 
2019-03-07

 




1
#include <bits/stdc++.h> 2 using namespace std; 3 #define max 0x3f3f3f3f//无穷大; 4 int tre[30][30],val[30],vis[30],n; 5 void prim()//本算法是采用prim来写最小生成树的,当然还有其他算法; 6 { 7 int v,min; 8 for(int i=0;i<n;i++) 9 { 10 val[i]=tre[0][i];//将和第一个点有关的点和它的路程的费用存到数组val; 11 vis[i]=1; 12 } 13 for(int i=1;i<=n;i++) 14 { 15 min=max; 16 for(int j=0;j<n;j++) 17 { 18 if(vis[j]&&min>val[j]) 19 { 20 min=val[j]; 21 v=j;//第一次找到所有和第一个点相连的点中路程费用最少的一个,并标记; 22 } 23 } 24 vis[v]=0;//让被纳入最小生成树的点下次不用再被遍历,所以赋值0; 25 for(int j=0;j<n;j++) 26 { 27 if(vis[j]&&val[j]>tre[v][j]) 28 { 29 val[j]=tre[v][j]; 30 } 31 }//第二次找到和最初点及第一次找到的点有关的不在最小生成树里面的边中最小的一条,并更新最少路程费用; 32 } 33 for(int i=1;i<n;i++) 34 { 35 val[0]+=val[i]; 36 } 37 cout<<val[0]<<endl; 38 39 } 40 41 int main() 42 { 43 int m,c; 44 char a[2],b[2]; 45 while(cin>>n&&n!=0) 46 { 47 for(int i=0;i<n;i++) 48 for(int j=0;j<n;j++) 49 { 50 if(i==j) 51 tre[i][j]=0; 52 else 53 tre[i][j]=max; 54 } 55 for(int i=1;i<n;i++) 56 { 57 cin>>a>>m; 58 for(int j=0;j<m;j++) 59 { 60 cin>>b>>c; 61 tre[a[0]-'A'][b[0]-'A']=tre[b[0]-'A'][a[0]-'A']=c;//建立总的大图; 62 } 63 } 64 prim(); 65 66 } 67 68 return 0; 69 }
如有转载请附上博主连接:https://home.cnblogs.com/u/AQhhhh/

 

posted @ 2019-03-07 21:17  AQhhhhh  阅读(232)  评论(0编辑  收藏  举报