1.dijkstra算法简介
Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式,是目前公认的最好的求解最短路径的方法。算法解决的是有向图中单个源点到其他顶点的最短路径问题,其主要特点是每次迭代时选择的下一个顶点是标记点之外距离源点最近的顶点。但由于dijkstra算法主要计算从源点到其他所有点的最短路径,所以算法的效率较低。
2.思路
1、把所有结点分成两组:
第一组:包括已经确定最短路径的结点;
第二组:包括尚未确定最短路径的结点。
2、开始时,第一组只包含起点,第二组包含剩余的点;
3、用贪心的策略,按最短路径长度递增的顺序把第二组的结点加到第一组去,直到v0可达的所有结点都包含于第一组中。在这个过程中,不断更新最短路径,总保持从v0到第一组各结点的最短路径长度dist都不大于从v0到第二组任何结点的路径长度。
4、每个结点对应一个距离值,第一组结点对应的距离就是v0到此结点的最短路径长度,第二组结点对应的距离值就是v0由第一组结点到此结点的最短路径长度。
5、直到所有的顶点都扫描完毕(v0可达的所有结点都包含于第一组中),找到v0到其它各点的所有最短路径。
动画演示:http://www.jcc.jx.cn/kejiandb/Dijkstra.swf
3. 代码实现:
//初始化路径,都为最大值。
int path[][]=new int[n+1][n+1];
for(int i=1;i<n+1;i++){
for(int j=1;j<n+1;j++)
path[i][j]=Integer.MAX_VALUE;
}
//这里需要输入path[i][j]的具体内容,如果有重复数据的话,需要更新路径为最小值。
int minLen[]=new int[n+1];
//visit初始为0,防止回溯
int visit[]=new int[n+1];
//初始化1到其他点的距离。
for(int i=1;i<n+1;i++){
minLen[i]=path[1][i];
}
void Dijkstra(){
minLen[1]=0;
visit[1]=1;
int minj=1;
for(int i=1;i<n+1;i++){
int min=Integer.MAX_VALUE;
for(int j=1;j<n+1;j++){
if(visit[j]==0 && minLen[j]<min){
min=minLen[j];
minj=j;
}
}
visit[minj]=1;
for(int j=1;j<n+1;j++){
if(visit[j] == 0 && minLen[minj] != Integer.MAX_VALUE&&path[minj][j]!=
Integer.MAX_VALUE&&minLen[j]>(minLen[minj]+path[minj][j])){
minLen[j]=minLen[minj]+path[minj][j];
}
}
}
}