最短路径算法(Dijkstra和Floyd)
2013-05-18 14:45
369 查看
最短路径:
最短路径是指两顶点之间经历的边数最少的路径,若边有权值,则指权值之和最小的路径。
Dijkstra(迪杰斯特拉)算法的基本思想:
每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
代码如下:
Floyd(弗洛伊德)算法的基本思想:
从任意节点 A 到任意节点 B 的最短路径不外乎 2 种可能,1 是直接从 A 到 B,2 是从 A 经过若干个节点 X 到 B。所以,我们假设 ShortPathTable(AB) 为节点 A 到节点 B 的最短路径的距离,对于每一个节点 X ,我们检查ShortPathTable(AX) + ShortPathTable(XB) < ShortPathTable(AB) 是否成立,如果成立,证明从 A 到 X 再到 B 的路径比 A 直接到 B 的路径短,我们便设置 ShortPathTable(AB)
= ShortPathTable(AX) + ShortPathTable(XB),这样一来,当我们遍历完所有节点 X,ShortPathTable(AB) 中记录的便是 A 到 B 的最短路径的距离。
代码如下:
最短路径是指两顶点之间经历的边数最少的路径,若边有权值,则指权值之和最小的路径。
Dijkstra(迪杰斯特拉)算法的基本思想:
每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
代码如下:
int Pathmatrix[MAXVEX];//用于存储最短路径下标的数组(前驱顶点的下标) int ShortPathTable[MAXVEX];//用于存储到各点最短路径的权值和 void ShortestPath(MGraph G,int Vo,int Pathmatrix[],int ShortPathTable[]) { int v,w,k,min; int final[MAXVEX];//若final[w]为1,表示求得顶点Vo到Vw的最短路径 for (v = 0; v < G.vertexNum; v++)//初始化数据 { final[v] = 0; Pathmatrix[v] = 0; ShortPathTable[v] = G.matrix[Vo][v];//将与Vo点有连线的顶点加上权值 } ShortPathTable[Vo] = 0;//Vo至Vo的路径为0 final[Vo] = 1; for (v = 1; v < G.vertexNum; v++)//每次循环求得Vo到某个顶点v的最短路径 { min = INFINITE;//初始化min for (w = 0; w < G.vertexNum; w++)//寻找离Vo最近的顶点 { if (!final[w] && ShortPathTable[w] < min) { k = w; min = ShortPathTable[w];//w顶点离Vo更近 } } final[k] = 1;//将目前找到的最近的顶点置为1 for (w = 0; w < G.vertexNum; w++)//更新当前最短路径及距离 { //如果经过v顶点的路径比现在这条路径的长度短的话 if (!final[w] && (min + G.matrix[k][w]) < ShortPathTable[w]) { ShortPathTable[w] = min + G.matrix[k][w]; Pathmatrix[w] = k; } } } }
Floyd(弗洛伊德)算法的基本思想:
从任意节点 A 到任意节点 B 的最短路径不外乎 2 种可能,1 是直接从 A 到 B,2 是从 A 经过若干个节点 X 到 B。所以,我们假设 ShortPathTable(AB) 为节点 A 到节点 B 的最短路径的距离,对于每一个节点 X ,我们检查ShortPathTable(AX) + ShortPathTable(XB) < ShortPathTable(AB) 是否成立,如果成立,证明从 A 到 X 再到 B 的路径比 A 直接到 B 的路径短,我们便设置 ShortPathTable(AB)
= ShortPathTable(AX) + ShortPathTable(XB),这样一来,当我们遍历完所有节点 X,ShortPathTable(AB) 中记录的便是 A 到 B 的最短路径的距离。
代码如下:
int Pathmatrix[MAXVEX][MAXVEX];//用于存储最短路径下标的数组 int ShortPathTable[MAXVEX][MAXVEX];//用于存储到各点最短路径的权值和 void ShortestPath(MGraph G,int Pathmatrix[][MAXVEX],int ShortPathTable[][MAXVEX]) { int v,w,k; for (v = 0; v < G.vertexNum; v++)//初始化数据 { for (w = 0; w < G.vertexNum; w++)//如果经过下标为k顶点路径比原来两点间路径更短 { ShortPathTable[v][w] = G.matrix[v][w]; Pathmatrix[v][w] = w; } } for (k = 0; k < G.vertexNum; k++) { for (v = 0; v < G.vertexNum; v++) { for (w = 0; w < G.vertexNum; w++) { if (ShortPathTable[v][w] > ShortPathTable[v][k] + ShortPathTable[k][w]) { ShortPathTable[v][w] = ShortPathTable[v][k] + ShortPathTable[k][w]; Pathmatrix[v][w] = Pathmatrix[v][k];//路径设置经过下标为k的顶点 } } } } }
相关文章推荐
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson,无一幸免
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 最小生成树算法(Prime、Kruskal)和最短路径算法(Dijkstra、Floyd)
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 最短路径算法 dijkstra + floyd + spfa 【记录 总结】
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 多路径路由算法选择(7)——最短路径算法Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 最短路径算法(Dijkstra、Floyd)总结
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)
- 数据结构看书笔记(十)—— 求最短路径问题之--迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 最小生成树(prime算法、kruskal算法) 和 最短路径算法(floyd、dijkstra)(转)
- 四种最短路径算法(Dijkstra,Floyd,Bellman-ford&&spfa)