算法学习-最短路径算法
来源:互联网 发布:mac怎么安装steam 编辑:程序博客网 时间:2024/05/16 04:33
算法学习-最短路径算法
Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
基本思想
通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。
此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 ... 重复该操作,直到遍历完所有顶点。
以上是算法的思想,但理解起来比较困难,严蔚敏版数据结构书中讲得也比较抽象,在查找资料时,看到了一个比较详细的图解和介绍,链接为:http://www.cnblogs.com/skywang12345/p/3711512.html
经过一天的学习,才基本理解了算法的思想,在实现时参考了数据结构书上的算法。下面,给出自己编写的比较简单的算法。其中对图的定义可能不是很完整。
#include "iostream.h"#define infinity 1000 //定义为无穷大,即不存在边#define max 6typedef struct graph{int vexs[max]; //顶点向量int arcs[max][max];//带权邻接矩阵int vexnum,arcnum;//顶点数目、边数目}mgraph;void shortpath_dij(mgraph g,int v0,int p[max][max],int d[max]){int final[max]; //已经求得从v0到v的最短路径时,置为1for(int v=0;v<g.vexnum;++v) //初始化{final[v]=0;d[v]=g.arcs[v0][v];//v0到v的距离for(int w=0;w<g.vexnum;++w)p[v][w]=0;if(d[v]<infinity)//距离不为无限大,即v0有边到v{p[v][v0]=1;p[v][v]=1;}}final[v0]=1;d[v0]=0; //初始点for(int i=0;i<g.vexnum;++i)//循环,求v0到每个点v的最短路径{int min=infinity;for(int w=0;w<g.vexnum;++w){if(!final[w])if(d[w]<min) //w点距离更近{v=w;min=d[w];}}final[v]=1;for(w=0;w<g.vexnum;++w) //更新当前最短路径和距离{if(!final[w]&&(min+g.arcs[v][w]<d[w])){d[w]=min+g.arcs[v][w];for(int j=0;j<g.vexnum;++j)p[w][j]=p[v][j];p[w][w]=1; }}}}void main(){int p[max][max];int d[max];//初始化图 注意赋值的格式(调试此处出现多次错误)mgraph m_g={{0,1,2,3,4,5}, {infinity,infinity,10,infinity,30,100,infinity,infinity,5,infinity,infinity,infinity,infinity,infinity,infinity,50,infinity,infinity,infinity,infinity,infinity,infinity,infinity,10,infinity,infinity,infinity,20,infinity,60,infinity,infinity,infinity,infinity,infinity,infinity},6,8};shortpath_dij(m_g,0,p,d);for(int i=0;i<m_g.vexnum;++i) {for(int j=0;j<m_g.vexnum;++j)//打印路径{cout<<p[i][j]<<" ";}cout<<d[i]<<" "<<endl;//打印距离}}初始化的带权有向图如图:
运行结果为:
在程序结果中,每一行前六个为v0到此点的最短路径经过的顶点,最后一个为路径的距离。
此程序中值得改进的是,只求出了最短路径经过的顶点,但没有具体的路径走向,如v0->v5,使得结果显示为v0->v4->v3->v5,因为在边数过多的情况下,可能v0->v5的路径很多,这将是后期的工作。
- 最短路径算法学习
- 算法学习-最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 最短路径算法
- 对CSS中的Position、Float属性的一些深入探讨
- 大学,学会这样上网才有意义!
- 数据结构:图(邻接多重表存储 c++实现)
- 还原 IE 源查看器
- linux shell “永久环境变量”、“临时环境变量”和"普通变量"之完全解读
- 算法学习-最短路径算法
- 堆的实现
- Android : ExpandableListView 使用方法
- 猫猫学IOS(三十八)UI之核心动画简介
- Swift学习收录
- CXF获取客户端IP
- @Component 单例 多例
- php选择排序法
- Codeforces Round #302 (Div. 2) (ABCD题解)