Dijkstra(迪杰斯特拉)算法

来源:互联网 发布:淘宝关键词top100 编辑:程序博客网 时间:2024/06/06 16:24

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;//起始点为0int 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;

0 0