读书人

Dijkstra算法java兑现

发布时间: 2012-12-19 14:13:15 作者: rapoo

Dijkstra算法java实现
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。

算法描述

  (这里描述的是从节点1开始到各点的dijkstra算法,其中Wa->b表示a->b的边的权值,d(i)即为最短路径值)
  1. 置集合S={2,3,...n}, 数组d(1)=0, d(i)=W1->i(1,i之间存在边) or +无穷大(1.i之间不存在边)
  2. 在S中,令d(j)=min{d(i),i属于S},令S=S-{j},若S为空集则算法结束,否则转3
  3. 对全部i属于S,如果存在边j->i,那么置d(i)=min{d(i), d(j)+Wj->i},转2
  Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
  算法具体步骤 
  (1)初始时,S只包含源点,即S=,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。
  (2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
  (3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
  (4)重复步骤(2)和(3)直到所有顶点都包含在S中。
编辑本段
复杂度分析

  Dijkstra 算法的时间复杂度为O(n^2)
  空间复杂度取决于存储方式,邻接矩阵为O(n^2)

百度百科上有它的c语言实现可以去参考,这里用的是java语言来实现



/*** CreatArrayForAll类用于初始化数组,可为各种算法所使用* 给定JButton和int类型的数组及一个Jpanel变量,* 给定环境的大小(x,y)和初始位置及目标位置***/package page;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class CreatArrayForAll  {public CreatArrayForAll(){}public CreatArrayForAll(JButton[][] b,int[][] environ,JPanel contentPane,int MaxM,int MaxN,int startX,int startY,int goalX,int goalY){int i=0;//初始化环境图:创建并设置按钮组的属性,所有的按钮背景为白,前台颜色为黑,数组所有元素为零for( i=0;i<MaxM;i++){for(int j=0;j<MaxN;j++){//创建一个按钮,并将按钮加入窗体中b[i][j]=new JButton();b[i][j].setBackground(Color.white);  //背景颜色为白色b[i][j].setForeground(Color.black);  //前台颜色为黑色contentPane.add(b[i][j]); environ[i][j]=0;  }}    //设置障碍区域颜色为黑色,environ数组中的值设为555    b[4][42].setBackground(Color.black); environ[4][42]=555;    b[4][43].setBackground(Color.black);environ[4][43]=555;    b[5][43].setBackground(Color.black);environ[5][43]=555;    b[5][44].setBackground(Color.black);environ[5][44]=555;    b[6][43].setBackground(Color.black);environ[6][43]=555;    b[6][44].setBackground(Color.black);environ[6][44]=555;    b[7][44].setBackground(Color.black);environ[7][44]=555;    b[7][45].setBackground(Color.black);environ[7][45]=555;    b[8][46].setBackground(Color.black);environ[8][46]=555;    b[8][47].setBackground(Color.black);environ[8][47]=555;    b[8][28].setBackground(Color.black);environ[8][28]=555;    b[8][29].setBackground(Color.black);environ[8][29]=555;    b[9][28].setBackground(Color.black);environ[9][28]=555;    b[9][29].setBackground(Color.black);environ[9][29]=555;    b[10][9].setBackground(Color.black);environ[10][9]=555;    b[11][8].setBackground(Color.black);environ[11][8]=555;    b[11][9].setBackground(Color.black);environ[11][9]=555;    b[11][30].setBackground(Color.black);environ[11][30]=555;    b[12][29].setBackground(Color.black);environ[12][29]=555;    b[12][30].setBackground(Color.black);environ[12][30]=555;    for(i=7;i<=11;i++)    {    b[13][i].setBackground(Color.black);environ[13][i]=555;    b[18][i].setBackground(Color.black);environ[18][i]=555;    }for(i=28;i<=31;i++){b[13][i].setBackground(Color.black);environ[13][i]=555;    b[14][i].setBackground(Color.black);environ[14][i]=555;}b[22][49].setBackground(Color.black);environ[22][49]=555;b[23][48].setBackground(Color.black);environ[23][48]=555;b[23][49].setBackground(Color.black);environ[23][49]=555;for(i=47;i<50;i++){b[24][i].setBackground(Color.black);environ[24][i]=555;}b[24][9].setBackground(Color.black);environ[24][9]=555;b[23][8].setBackground(Color.black);environ[23][8]=555;b[23][9].setBackground(Color.black);environ[23][9]=555;b[25][48].setBackground(Color.black);environ[25][48]=555;b[25][49].setBackground(Color.black);environ[25][49]=555;b[26][49].setBackground(Color.black);environ[26][49]=555;b[49][28].setBackground(Color.black);environ[49][28]=555;for(i=32;i<=33;i++){b[14][i].setBackground(Color.black);environ[14][i]=555;b[15][i].setBackground(Color.black);environ[15][i]=555;}b[48][28].setBackground(Color.black);environ[48][28]=555;for(i=27;i<30;i++){b[49][i].setBackground(Color.black);environ[49][i]=555;}b[42][8].setBackground(Color.black);environ[42][8]=555;b[42][9].setBackground(Color.black);environ[42][9]=555;b[42][25].setBackground(Color.black);environ[42][25]=555;b[42][26].setBackground(Color.black);environ[42][26]=555;b[42][42].setBackground(Color.black);environ[42][42]=555;b[42][43].setBackground(Color.black);environ[42][43]=555;b[43][9].setBackground(Color.black);environ[43][9]=555;b[43][42].setBackground(Color.black);environ[43][42]=555;b[44][13].setBackground(Color.black);environ[44][13]=555;b[46][13].setBackground(Color.black);environ[46][13]=555;for(i=12;i<15;i++){b[45][i].setBackground(Color.black);environ[45][i]=555;}//将初始单元格和目标单元格标记出来//b[startX][startY].setText("Start");//b[goalX][goalY].setText("Goal");b[startX][startY].setBackground(Color.red);b[goalX][goalY].setBackground(Color.red);}}

读书人网 >编程

热点推荐