刷题记录

pat刷题记录

Travel Plan (30)
Dijkstra求最短路径方法
首先找出所有点中的最小点逐次更新各点之间的最短距离,并以一个数组存储

int dist[505];
//用来存储各点最小距离
int past[505];
int dist1[505][505];//用来存储邻接矩阵
int cost1[505][505]; //存储各段之间的花销
bool visit[505];//用来存储是否有被访问过
int cost[505];  //存储总花销
int m,n,c,d;
void djst()
{    
while(!visit[d])       //直到访问到目的终点为止
{        
int v=-1;        
int min=init_max;        
for(int i=0;i<m;i++)           
 if(!visit[i]&&dist[i]<min) //选取未被访问过的最小距离的点           
 {  min=dist[i];                
     v=i;            
     }        
 if(v==-1)    //证明所有点都访问过了或者图不连通,那么退出         
 return;        
 visit[v]=true;       
 for(int i=0;i<m;i++)        //使用新被选取的点,对所有的距离进行更新       
   if(!visit[i]&&dist[i]>dist[v]+dist1[v][i]&&dist1[v][i]!=0)            
  { 
     dist[i]=dist[v]+dist1[v][i];              
     cost[i]=cost[v]+cost1[v][i];              
     past[i]=v;  //存储当前最小距离的前驱节点,方便之后的输出
   }        
     else if(!visit[i]&&dist[i]==dist[v]+dist1[v][i]&&cost[i]>cost[v]+cost1[v][i] &&dist1[v][i]!=0)        
     {            
     cost[i]=cost[v]+cost1[v][i];     //路径相同就存储花费最小      
     past[i]=v;        
     } }}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值