1. 算法描述
从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
2. 算法流程
①初始化dist、path、set。
②从通往当前剩余顶点的路径中选出长度最短的。
③以该顶点为中间点检测剩余顶点。
④循环至结束
例:
完整的Java代码:
package dijkstra;
public class Main {
int n = 7;//顶点个数
int dist[] = new int[7];//当前已找到的最短路径
int edges [][] = new int[7][7];//存放权值信息
int path [] = new int[7];//存放至终点的上一个顶点
int set[] = new int[7];//标记某顶点是否并入最短路径
public static void main(String[] args) {
Main main = new Main();
main.init();
main.dijkstra();
main.myPrint();
}
void dijkstra(){
int v = 0;//起始点为0
int min,i,j,u = 0;
//初始化数组
for(i=0;i<dist.length;i++){
dist[i] = edges[v][i];
set[i] = 0;
if(edges[v][i]<Integer.MAX_VALUE){
path[i] = v;
}else{
path[i] = -1;
}
}
set[v] = 1;
path[v] = -1;
for(i=0;i<7;++i){
min = Integer.MAX_VALUE;
//从剩余顶点中选出一个顶点,通往该顶点的路径是剩余顶点中最小的
for(j=0;j<7;++j){
if(set[j]==0&&dist[j]<min){
u = j;
min = dist[j];
}
}
set[u] = 1;
//以刚并入的顶点为中间点,对所有通往剩余顶点的路径进行检测
for(j=0;j<7;j++){
if(set[j]==0&&edges[u][j]!=Integer.MAX_VALUE&&dist[u]+edges[u][j]<dist[j]){
dist[j] = dist[u] + edges[u][j];
path[j] = u;
}
}
}
}
void init(){
for(int i=0;i<7;i++){
for(int j=0;j<7;j++){
if(i!=j){
edges[i][j] = Integer.MAX_VALUE;
}
}
}
edges[0][1] = 4;
edges[0][2] = 6;
edges[0][3] = 6;
edges[1][2] = 1;
edges[1][4] = 7;
edges[2][4] = 6;
edges[2][5] = 4;
edges[3][2] = 2;
edges[3][5] = 5;
edges[4][6] = 6;
edges[5][4] = 1;
edges[5][6] = 8;
}
void myPrint(){
System.out.println();
for(int i=0;i<7;++i){
System.out.print(dist[i]+" ");
}
System.out.println();
for(int i=0;i<7;++i){
System.out.print(path[i]+" ");
}
System.out.println();
for(int i=0;i<7;++i){
System.out.print(set[i]+" ");
}
System.out.println();
}
}
备注:
①Integer.MAX_VALUE表示int所能表示的最大值0x7FFFFFFF,Java中int占4字节,一字节为8位。例:Integer.MAX_VALUE + 1 = Integer.MIN_VALUE;