资源描述:
《Dijkstra算法的流程图.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Dijkstra算法的流程图需求和规格说明:Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。算法本身并不是按照我们的思维习惯——求解从原点到第一个点的最短路径,再到第二个点的最短路径,直至最后求解完成到第n个点的最短路径,而是求解从原点出发的各有向路径的从小到大的排列,但是算法最终确实得到了从原点到图中其余各点的最短路径,可以说这是个副产品,对于算法的终结条件也应
2、该以求得了原点到图中其余各点的最短路径为宜。清楚了算法的这种巧妙构思后,理解算法本身就不是难题了。实现注释:想要实现的功能:Dijkstra算法是用来求任意两个顶点之间的最短路径。在该实验中,我们用邻接矩阵来存储图。在该程序中设置一个二维数组来存储任意两个顶点之间的边的权值。用户可以将任意一个图的信息通过键盘输入,让后在输入要查找的两个顶点,程序可以自动求出这两个顶点之间的最短路径。已经实现的功能:在该实验中,我们用邻接矩阵来存储图。在该程序中设置一个全局变量的二维数组,用它来存储任意两个顶点之间的边的权值。然后通过最短路径的计算,输
3、入从任意两个顶点之间的最短路径的大小。用户手册:对于改程序,不需要客户进行什么复杂的输入,关键是用来存放图的任意两个顶点之间的边的权值的二维数组的初始化,即将要通过Dijkstra算法求最短路径的图各条边的权值放入二维数组中。这样程序就可以自动的计算出任意两个顶点之间的最短路径并且进行输出。设计思想:s为源,w[u,v]为点u和v之间的边的长度,结果保存在dist[]初始化:源的距离dist[s]设为0,其他的点距离设为无穷大,同时把所有的点状态设为没有扩展过。循环n-1次:1.在没有扩展过的点中取一距离最小的点u,并将其状态设为已扩
4、展。2.对于每个与u相邻的点v,如果dist[u]+w[u,v]#include"Conio.h"#definetrue1#definefalse0#defineI9999//无穷大#defineN5//城市顶点的数目intcost[N][N]={{0,3,I,8,I},{3,0,5,I,4},{I,5,0,4
5、,7},{8,I,4,0,2},{I,4,7,2,0}};intdist[N];//存储当前最短路径长度intv0='A'-65;//初始点是Aintmain(){intfinal[N],i,v,w,min,k;printf("任意两个定点之间的最短路径如下:");for(k=0;k6、;//寻找另外N-1个结点for(i=0;i%
7、c:%2dt",v0+65,i+65,dist[i]);}printf("");v0++;}return0;}运行结果:调试报告:错误:运行结果如下:而正确的运行结果是这样的:出现的问题是在寻找最短路径和更新dist[]数据的两个for循环之间少了一个赋值语句。如下:final[v]=true;//加入新边当每次找到从v0到其它各定点的最短路径是,将该定点标记为已经找到了最短路径,下次查找是不再对该顶点的dist[]的值进行改变。