标签:存储 说明 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