最短路径算法(Dijkstra和Floyd)

来源:互联网 发布:ubuntu google chrome 编辑:程序博客网 时间:2024/04/29 22:08

最短路径:

        最短路径是指两顶点之间经历的边数最少的路径,若边有权值,则指权值之和最小的路径。


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的路径为0final[Vo] = 1;for (v = 1; v < G.vertexNum; v++)//每次循环求得Vo到某个顶点v的最短路径{min = INFINITE;//初始化minfor (w = 0; w < G.vertexNum; w++)//寻找离Vo最近的顶点{if (!final[w] && ShortPathTable[w] < min){k = w;min = ShortPathTable[w];//w顶点离Vo更近}}final[k] = 1;//将目前找到的最近的顶点置为1for (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的顶点}}}}}


原创粉丝点击