1、算法目标
2、算法的基本思想
- 创建两个集合S和U,
集合S:代表已经访问过的顶点及起点到该顶点的距离;
集合U:代表还未访问过的顶点及到这些顶点的距离;
- 具体思想:从出发顶点开始,不断从集合U中取出从当前顶点出发,距离较短的顶点作为新的访问顶点,加入已访问过的顶点集合S,不断更新循环,直至U集合为空。
3、具体步骤
- step1:准备工作,获得各顶点以及其权重生成一个图;
- step2:定义一个dijks类,实现当顶点加入集合S时的各个属性的更新;
dijks类的属性可以用三个数组来表示:
boolean isvisit[];//当前节点是否被访问:true代表已访问,false代表未访问
int pre[];//代表当前节点的前驱节点,例如pre[2]=0,代表索引2的顶点的上一个索引的顶点未0;
int dis[];//代表从出发顶点到当前顶点的最短路径;
dijks类定义的相关方法,当顶点加入集合S时,实现三大数组的更新:
method1:public djsArr(int len,int index)——指定出发顶点,初始化dijks类;
method2:isVisit(int index)——判断当前顶点是否被访问过,如果被访问过,则为true,否则为false;
method3:updateDis(int len,int index )——更新出发顶点到index顶点的距离
mehtod4:updatePre(int pre,int index)——更新下标为pre为顶点的前驱节点为index;
method5:getDis(int index)——返回出发顶点到index顶点的距离
★method6:updateIndex()——更新index为最新的访问点
method7:addPath(i)——添加路径对应的下标
- step3:指定一个出发顶点,开始实现dijkstra算法,
- 1、首先找到出发顶点,调用★update()方法实现更新当前顶点的前驱节点pre与路径dis。- 2、遍历未访问过的顶点,找到从当前顶点开始的最短距离的顶点,作为新的访问点,调用updateIndex()进行更新新的访问点,然后更新的访问点的前驱节点与路径,然后重复步骤2,直至遍历结束。
关键方法:
method1:updateIndex()
/** * 更新index顶点为新的访问点 */ public int UpdateIndex(){ int index=0,minLen=10000; for (int i = 0; i <dis.length ; i++) { if (isvisit[i]==false&&dis[i]<minLen){ index=i; minLen=dis[i]; } } //将新的访问点置为已访问。 isvisit[index]=true; return index; }method2:update()
/** * 首先根据传入的出发顶点,更新pre前驱节点和出发顶点到各个顶点距离 * @param start 出发顶点的下标索引 */ private void update(int start) { int minlen=0; for (int i = 0; i <weight[start].length; i++) { minlen=dijks.getDis(start)+weight[start][i]; if (!dijks.isVisit(i)&&dijks.getDis(i)>minlen){ dijks.addPath(i); dijks.UpdatePre(i,start); dijks.UpdateDis(minlen,i); } } }
