单源最短路径Dijkstra算法的实现

pascal

PROCEDUREDIJKSTRA;

VAR

DIST:ARRAY[1..MAXP]OFLONGINT;{距离数组,记录目前从源点出发已经找到的最短路径长度}

VISITED:ARRAY[1..MAXP]OFBOOLEAN;{标志数组,记录是否已经找到了某一点的最终最短路径}

I,J,MIN,MINP:LONGINT;

BEGIN

FILLCHAR(VISITED,SIZEOF(VISITED),FALSE);{初始化源点和路径数组}

FORI:=1TOMAXPDO

BEGIN

DIST:=MAP[SOURCE,I];

IFDIST

PATH:=SOURCE

ELSE

PATH:=0;

END;{源点的最短路径肯定是不用找的...}

VISITED[SOURCE]:=TRUE;

{DIJKSTRA的思想是按递增长度来产生路径,每次选出当前已经

找到的最短的一条路径,它必然是一条最终的最短路径.因此

每次找出当前距离数组中最小的,必然是一条最终的最短路径}

FORI:=2TOMAXPDO

BEGIN

MIN:=INFINITY;

MINP:=0;

FORJ:=1TOMAXPDO

IF(NOTVISITED[J])AND(DIST[J]

BEGIN

MIN:=DIST[J];

MINP:=J;

END;{已找到源点到点MINP的最短路径,做上标志}

VISITED[MINP]:=TRUE;{修改距离数组}

FORJ:=1TOMAXPDO

IF(NOTVISITED[J])AND(DIST[MINP]+MAP[MINP,J]

BEGIN

DIST[J]:=DIST[MINP]+MAP[MINP,J];

PATH[J]:=MINP;

END;

END;

END;

Dijkstra算法的实现(c++)

//Computeshortestpathdistancesfroms,returntheminD

voidDijkstra(Graph*G,int*D,ints){//这里的s是指计算最小路径的源,但是题目中没有

用到,应该加一个

//初始化数组D的函数

/*

for(inti=0;in();i++){//仅供参考(本来这个初始化应该在传入时候就做好的,但是为了符合这个函数)

if(i==s)D[i]=0;

elseD[i]=INFINITY;

}

*/

inti,v,w;

for(i=0;in();i++){//Processthevertices

v=minVertex(G,D);

if(D[v]==INFINITY)return;//Unreachablevertices

G->setMark(v,VISITED);

for(w=G->first(v);wn();w=G->nexr(v,w))

if(D[w]>(D[v]+G->weight(v,w)))

D[w]=D[v]+G->weight(v,w);

}

}

intminVertex(Graph*G,int*D){//找出最小的点

inti,v;

for(i=0;in;i++){//找没有被访问的点

if(G->getMark(i)==UNVISITED){

v=i;break;

}

}

for(i++;in;i++){//找比上面还小的未被访问的点(注意此时的i++)

if((G->getMark(i)==UNVISITED)&&D[i]

v=i;

returnv;

}

//还有Graph类没有给出

pascal

PROCEDUREDIJKSTRA;

VAR

DIST:ARRAY[1..MAXP]OFLONGINT;{距离数组,记录目前从源点出发已经找到的最短路径长度}

VISITED:ARRAY[1..MAXP]OFBOOLEAN;{标志数组,记录是否已经找到了某一点的最终最短路径}

I,J,MIN,MINP:LONGINT;

BEGIN

FILLCHAR(VISITED,SIZEOF(VISITED),FALSE);{初始化源点和路径数组}

FORI:=1TOMAXPDO

BEGIN

DIST:=MAP[SOURCE,I];

IFDIST

PATH:=SOURCE

ELSE

PATH:=0;

END;{源点的最短路径肯定是不用找的...}

VISITED[SOURCE]:=TRUE;

{DIJKSTRA的思想是按递增长度来产生路径,每次选出当前已经

找到的最短的一条路径,它必然是一条最终的最短路径.因此

每次找出当前距离数组中最小的,必然是一条最终的最短路径}

FORI:=2TOMAXPDO

BEGIN

MIN:=INFINITY;

MINP:=0;

FORJ:=1TOMAXPDO

IF(NOTVISITED[J])AND(DIST[J]

BEGIN

MIN:=DIST[J];

MINP:=J;

END;{已找到源点到点MINP的最短路径,做上标志}

VISITED[MINP]:=TRUE;{修改距离数组}

FORJ:=1TOMAXPDO

IF(NOTVISITED[J])AND(DIST[MINP]+MAP[MINP,J]

BEGIN

DIST[J]:=DIST[MINP]+MAP[MINP,J];

PATH[J]:=MINP;

END;

END;

END;

Dijkstra算法的实现(c++)

//Computeshortestpathdistancesfroms,returntheminD

voidDijkstra(Graph*G,int*D,ints){//这里的s是指计算最小路径的源,但是题目中没有

用到,应该加一个

//初始化数组D的函数

/*

for(inti=0;in();i++){//仅供参考(本来这个初始化应该在传入时候就做好的,但是为了符合这个函数)

if(i==s)D[i]=0;

elseD[i]=INFINITY;

}

*/

inti,v,w;

for(i=0;in();i++){//Processthevertices

v=minVertex(G,D);

if(D[v]==INFINITY)return;//Unreachablevertices

G->setMark(v,VISITED);

for(w=G->first(v);wn();w=G->nexr(v,w))

if(D[w]>(D[v]+G->weight(v,w)))

D[w]=D[v]+G->weight(v,w);

}

}

intminVertex(Graph*G,int*D){//找出最小的点

inti,v;

for(i=0;in;i++){//找没有被访问的点

if(G->getMark(i)==UNVISITED){

v=i;break;

}

}

for(i++;in;i++){//找比上面还小的未被访问的点(注意此时的i++)

if((G->getMark(i)==UNVISITED)&&D[i]

v=i;

returnv;

}

//还有Graph类没有给出


相关文章

  • 带限制条件的最短路径算法与实现
  • 第32卷增刊 2004年12月福州大学学报(自然科学版) Journal of Fuzhou University(Natural Science) Vol. 32Supp. Dec. 2004 文章编号:1000-2243(2004) 增 ...查看


  • 单源点最短路径算法
  • 数据结构课程设计 设计说明书 单元点最短路径算法的实现 学生姓名 学 号 班 级 成 绩 指导教师 数学与计算机科学学院 2014年3月7日 课程设计任务书 2013-2014学年第2 学期 专业:信息管理与信息系统 学号: 1221024 ...查看


  • 技术贴 | 从算法层解读,自动驾驶的「轨迹规划」如何实现?
  • 车辆自主驾驶系统从本质上讲是一个智能控制机器,其研究内容大致可分为信息感知.行为决策及操纵控制三个子系统.路径规划是智能车辆导航和控制的基础,是从轨迹决策的角度考虑的,可分为局部路径规划和全局路径规划. 全局路径规划的任务是根据全局地图数据 ...查看


  • 贪心法求解单元最短路径问题
  • 实验1. 贪心法求解单源最短路径问题 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试).应用贪心策略求解有向带权图的单源最短路径问题. 实验目的 通过本次实 ...查看


  • 路由选择算法改进
  • Bellman-Ford 算法及其优化 一.引言 Bellman-Ford 算法与另一个非常著名的Dijkstra 算法一样,用于求解单源点最短路径问题.Bellman-ford 算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题 ...查看


  • 最小生成树问题
  • 河南城建学院 课 程设计 报告书 专 业:计算机科学与技术 课程设计名称:<数据结构课程设计> 题 目:最小生成树问题 班 级: 学 号: 姓 名: 同 组 人 员: 指 导 老 师: 完 成 时 间: 2012年2月17日 摘 ...查看


  • 物流配送车辆调度问题毕业论文设计
  • 兰 州 商 学 院 本科生毕业论文(设计) 论文(设计)题目: 物流配送车辆调度问题 学 院. 系: 信息工程学院 数学系 专 业 (方 向) : 信息与计算科学专业 年 级. 班: 2008级信息与计算科学班 学 生 姓 名: 陈海燕 指 ...查看


  • 数据结构地铁换乘导航系统实验报告
  • Assignment 3 A Query System for Guangzhou Metro cs1301 13349**** 本次实验需要利用图的相关算法,来实现一个广州地铁查询系统,计算起点到终点的最短路径长度.经过的站点数以及给出线 ...查看


  • 数学建模论文_无人机自主飞行航迹规划问题
  • 题 目 无人机自主飞行航迹规划问题 摘要 本文分别研究了基于二维平面和三维空间的最优航迹规划问题. 对于第一问,我们在忽略地形和无人机操作性能等因素影响的基础上,将影响无人机飞行的"敌方雷达威胁"和"飞行燃油代 ...查看


热门内容