一、含义
- 非网图的最短路径是两顶点之间经过的边数最少的路径;
- 网图的最短路径是指两顶点之间经过的边上权值之和最少的路径,并且称路径上第一个顶点是源点,最后一个顶点是终点。
本文主要讲网图的最短路径。
二、迪杰斯特拉(Dijkstra)算法
迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,算出源点到每一个点的最短距离,直到扩展到终点为止。
代码示例:
//迪杰斯特拉
private static void ShortestPath_Dijkstra(int v0){
int v, min;
int w;
int[] end =new int[matrix.getVerNum()]; //顶点至该点的路径长度
for(v = 0; v < matrix.getVerNum(); v++){
end[v] = 0;
Patharc[v] = 0; //初始化路径数组都为0
ShortPathTable[v] = matrix.getArc()[v0][v]; //给v0相邻的点加上权值
}
ShortPathTable[v0] = 0;
end[v0] = 1;
for(v = 1; v < matrix.getVerNum(); v++){
min = INFINITY; //当前所知离v0顶点最近的距离
for(w = 0; w < matrix.getVerNum(); w++){
if(end[w] == 0 && ShortPathTable[w] < min){
k = w;
min = ShortPathTable[w];
}
}
end[k] = 1;
for (w = 0; w < matrix.getVerNum(); w++){
if(end[w] == 0 && (min + matrix.getArc()[k][w] < ShortPathTable[w])){
ShortPathTable[w] = min + matrix.getArc()[k][w];
Patharc[w] = k;
}
}
}
System.out.println("最短路径为:"+ ShortPathTable[matrix.getVerNum()-1]);
}
时间复杂度为O(n^2^)。
三、弗洛伊德(Floyd)算法
对于图的邻接矩阵D,假设D^1^矩阵中点v~2~对应的值为v~0~到v~2~的最短路径,满足下面的公式:
D^1^[v][w] = min{D[v][w],D[v][0]+D[0][w]}
以此类推,可以做出满足每个点出的值都等于其对应的最短路径的矩阵。
还可以做一个P矩阵存储最短路径。
代码如下:
//Floyd算法
private static void ShortestPath_Floyd(){
int v,w,k;
for (v = 0; v < matrix.getVerNum(); ++v){
for (w = 0; w < matrix.getVerNum(); ++w){
Pathmatirx[v][w] = w;
ShortPathTable[v][w] = matrix.getArc()[v][w];
}
}
for (k = 0; k < matrix.getVerNum(); ++k){
for (v = 0; v < matrix.getVerNum(); ++v){
for(w = 0; w < matrix.getVerNum(); ++w){
if(ShortPathTable[v][w] > ShortPathTable[v][k]+ShortPathTable[k][w]){
ShortPathTable[v][w] = ShortPathTable[v][k]+ShortPathTable[k][w];
Pathmatirx[v][w]=Pathmatirx[v][k];
}
}
}
}
System.out.println("最短路径为:"+ShortPathTable[0][matrix.getVerNum()-1]);
}
时间复杂度为O(n^3^)。