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/

 

转载于:https://www.cnblogs.com/AQhhhh/p/10492407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值