码迷,mamicode.com
首页 > 其他好文 > 详细

最短路径

时间:2020-06-24 19:19:41      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:存储   说明   short   nbsp   ini   迪杰斯特拉   jks   主循环   arc   

迪杰斯特拉算法

时间复杂度O(n3)

 1 typedef int Patharc[MAXVEX];    /* 用于存储最短路径下标的数组 */
 2 typedef int ShortPathTable[MAXVEX];/* 用于存储到各点最短路径的权值和 */
 3 
 4 #define MAXVEX 9
 5 #define INFINITY 65535
 6 
 7 void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D)
 8 {    
 9     int v,w,k,min;    
10     int final[MAXVEX];/* final[w]=1表示求得顶点v0至vw的最短路径 */
11     for(v=0; v<G.numVertexes; v++)    /* 初始化数据 */
12     {        
13         final[v] = 0;            /* 全部顶点初始化为未知最短路径状态 */
14         (*D)[v] = G.arc[v0][v];/* 将与v0点有连线的顶点加上权值 */
15         (*P)[v] = -1;                /* 初始化路径数组P为-1  */       
16     }
17 
18     (*D)[v0] = 0;  /* v0至v0路径为0 */  
19     final[v0] = 1;    /* v0至v0不需要求路径 */        
20     /* 开始主循环,每次求得v0到某个v顶点的最短路径 */   
21     for(v=1; v<G.numVertexes; v++)   
22     {
23         min=INFINITY;    /* 当前所知离v0顶点的最近距离 */        
24         for(w=0; w<G.numVertexes; w++) /* 寻找离v0最近的顶点 */    
25         {            
26             if(!final[w] && (*D)[w]<min)             
27             {                   
28                 k=w;                    
29                 min = (*D)[w];    /* w顶点离v0顶点更近 */            
30             }        
31         }        
32         final[k] = 1;    /* 将目前找到的最近的顶点置为1 */
33         for(w=0; w<G.numVertexes; w++) /* 修正当前最短路径及距离 */
34         {
35             /* 如果经过v顶点的路径比现在这条路径的长度短的话 */
36             if(!final[w] && (min+G.arc[k][w]<(*D)[w]))   
37             { /*  说明找到了更短的路径,修改D[w]和P[w] */
38                 (*D)[w] = min + G.arc[k][w];  /* 修改当前路径长度 */               
39                 (*P)[w]=k;        
40             }       
41         }   
42     }
43 }

 

弗洛伊德算法

时间复杂度O(n3)

 1 typedef int Patharc[MAXVEX][MAXVEX];
 2 typedef int ShortPathTable[MAXVEX][MAXVEX];
 3 
 5 void ShortestPath_Floyd(MGraph G, Patharc *P, ShortPathTable *D)
 6 {    
 7     int v,w,k;    
 8     for(v=0; v<G.numVertexes; ++v) /* 初始化D与P */  
 9     {        
10         for(w=0; w<G.numVertexes; ++w)  
11         {
12             (*D)[v][w]=G.arc[v][w];    /* D[v][w]值即为对应点间的权值 */
13             (*P)[v][w]=w;                /* 初始化P */
14         }
15     }
16     for(k=0; k<G.numVertexes; ++k)   
17     {
18         for(v=0; v<G.numVertexes; ++v)  
19         {        
20             for(w=0; w<G.numVertexes; ++w)    
21             {
22                 if ((*D)[v][w]>(*D)[v][k]+(*D)[k][w])
23                 {/* 如果经过下标为k顶点路径比原两点间路径更短 */
24                     (*D)[v][w]=(*D)[v][k]+(*D)[k][w];/* 将当前两点间权值设为更小的一个 */
25                     (*P)[v][w]=(*P)[v][k];/* 路径设置为经过下标为k的顶点 */
26                 }
27             }
28         }
29     }
30 }

 

 

代码摘自《大话数据结构》,有删改

最短路径

标签:存储   说明   short   nbsp   ini   迪杰斯特拉   jks   主循环   arc   

原文地址:https://www.cnblogs.com/3467580254zsb/p/13188968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!