1 最短路径概念
1.1 定义
官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径。并且我们称路径上的第一个顶点为源点,最后一个顶点为终点。由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径。
1.2 对比
最小生成树:能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。
最短路径:是从一点出发,到达目的地的路径最小(到某顶点的路径也是最小)。
2 解析
原始图:
步骤1:从v0找到了未访问&最短路径顶点v1,步骤二:以v1为基础(二维数组第一下标)遍历相关联边(v2、v3、v4),并把权值计算对比大小,小的加到最短路径和数组中:
步骤1:遍历找到了未访问&最短路径顶点v2,步骤二:以v2为基础(二维数组第一下标)遍历相关联边(v4、v5),并把权值计算对比大小,小的加到最短路径和数组中:
这样就可以得到:V0到V8最短路径为:V8<-V7<-V6<-V3<-V4<-V2<-V1<-V0
即就是: V0->V1->V2->V4->V3->V6->V7->V8。
3 参考链接
4 源码
DnjavaDijstra .java
package com.dn.dijstra;
public class DnjavaDijstra {
private final static int MAXVEX = 9;
private final static int MAXWEIGHT = 65535;
/**
* Dijkstra算法,求有向网G的v0顶点到其余顶点v最短路径及带权长度
*
* 最小生成树:能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。
* 最短路径:是从一点出发,到达目的地的路径最小(到某顶点的路径也是最小)。
*/
public void shortestPathDijstra(Graph graph) {
int min;
int k = 0;// 记录下标
boolean isgetPath[] = new boolean[MAXVEX];//记录已找最小路径数组,isgetPath==true表示已找到
int shortTablePath[] = new int[MAXVEX];//记录的是v0到某顶点的最短路径和
//初始化第0行权值数组
for (int v = 0; v < graph.getVertexSize(); v++) {
shortTablePath[v] = graph.getMatrix()[0][v];// 默认获取v0这一行的权值数组
}
shortTablePath[0] = 0;
isgetPath[0] = true;
//开始主循环,每次求得v0到某个v顶点的最短路径
for (int v = 1; v < graph.getVertexSize(); v++) {
min = MAXWEIGHT;默认当前所知离v0顶点的最近距离
//步骤1.查找离v0最近的顶点(v1)
for (int w = 0; w < graph.getVertexSize(); w++) {
if (!isgetPath[w] && shortTablePath[w] < min) {
k = w;//(v1)
min = shortTablePath[w];//w(v1)顶点离v0顶点更近
}
}
//赋值
isgetPath[k] = true;//将目前找到的最近的顶点置为true(v1)
//步骤2.查找离v1最近的顶点(v2、v3、v4),并修正当前最短路径与距离
for (int j = 0; j < graph.getVertexSize(); j++) {
//如果经过v顶点的路径比现在这条路径的长度短的话
if(!isgetPath[j]&&(min+graph.getMatrix()[k][j]<shortTablePath[j])){//(v1)到其他顶点路径
//找到了更短的路径,修改shortTablePath[j]
shortTablePath[j] = min + graph.getMatrix()[k][j];
}
}
}
for(int i = 0;i<shortTablePath.length;i++){
System.out.println("V0到V"+i+"的最短路径为:"+shortTablePath[i]+"\n");
}
}
public static void main(String[] args){
Graph graph = new Graph(MAXVEX);
graph.createGraph();
DnjavaDijstra dijstra = new DnjavaDijstra();
dijstra.shortestPathDijstra(graph);
}
}