Dijkstra — 最短路径算法
2015-07-26 14:43
513 查看
Dijkstra算法,狄克斯特拉算法,在有向图中搜索最短路径。
本文实现单个顶点到其余各个顶点之间的最短路径,与Prim算法有很多相似的地方。
算法实现的主要步骤:
(1) 初始化
所有点都初始化为没有被访问,初始化根结点到各结点的距离,存放在lowcost[]数组中;
(2)寻找最小值
从根结点开始,其依据:按照由近到远的次序求解
找到最小值后,更新lowcost[]
更新lowcost[]与Prim算法不同。
(3)重复第(2)步,直到所有点都被选中,则算法结束。
本文依据下图对算法实现:
![](http://img.blog.csdn.net/20150726143722610)
具体代码如下,已经在vs2010测试通过。
算法运行结果如图所示:
本文实现单个顶点到其余各个顶点之间的最短路径,与Prim算法有很多相似的地方。
算法实现的主要步骤:
(1) 初始化
所有点都初始化为没有被访问,初始化根结点到各结点的距离,存放在lowcost[]数组中;
(2)寻找最小值
从根结点开始,其依据:按照由近到远的次序求解
找到最小值后,更新lowcost[]
更新lowcost[]与Prim算法不同。
(3)重复第(2)步,直到所有点都被选中,则算法结束。
本文依据下图对算法实现:
具体代码如下,已经在vs2010测试通过。
#include <iostream> using namespace std; #define DirectedGraphNode 8 #define INFINITE 1000 void Dijkstra(int directedGraph[][DirectedGraphNode], bool visited[], int lowcost[], int path[]) { //初始化 memset(visited, 0, sizeof(bool) * DirectedGraphNode); for(int i = 1; i < DirectedGraphNode; i++) lowcost[i] = directedGraph[0][i]; visited[0] = true; path[0] = 0; int k = 0; int min; int minIndex; for(int i = 1; i < DirectedGraphNode; i++ )//外循环,每次循环确定一个点 { min = INFINITE; //寻找最小值 for(int j = 1; j < DirectedGraphNode; j++) { if(false == visited[j] && lowcost[j] < min) { min = lowcost[j]; minIndex = j; } } visited[minIndex] = true;//该点被访问 path[++k] = minIndex; //更新lowcost[] //lowcost[]为各个结点到根结点的最短距离,从根结点出发,依次到达各结点 for(int j = 1; j < DirectedGraphNode; j++) { if(false == visited[j] && lowcost[j] > lowcost[minIndex] + directedGraph[minIndex][j]) lowcost[j] = lowcost[minIndex] + directedGraph[minIndex][j]; } } } void DijkstraRun() { //点与点之间存在边,权重为非零值,非无穷大值 //点与点之间不存在边,权重为无穷大值 int directedGraph[][DirectedGraphNode] = { {INFINITE, 30, 50, INFINITE, 10, INFINITE, INFINITE, INFINITE}, {INFINITE, INFINITE, 2, INFINITE, INFINITE, INFINITE, 6, INFINITE}, {INFINITE, INFINITE, INFINITE, 20, INFINITE, INFINITE, 3, INFINITE}, {INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE}, {20, 18, INFINITE, INFINITE, INFINITE, 7, INFINITE, INFINITE}, {INFINITE, 8, INFINITE, INFINITE, INFINITE, INFINITE, 15, INFINITE}, {INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, INFINITE, 15}, {INFINITE, INFINITE, INFINITE, 12, INFINITE, INFINITE, INFINITE, INFINITE}, }; bool visited[DirectedGraphNode]; int path[DirectedGraphNode]; int lowcost[DirectedGraphNode]; Dijkstra(directedGraph, visited, lowcost, path); cout<<"访问结点的顺序:"<<endl; for(int i = 0; i < DirectedGraphNode; i++) cout<<"v"<<path[i] + 1<<" ";//v1表示第一个结点 cout<<endl<<endl; cout<<"各个结点到根结点的最短路径值:"<<endl; for(int i = 1; i < DirectedGraphNode; i++) cout<<lowcost[i]<<" "; cout<<endl; } int _tmain(int argc, _TCHAR* argv[]) { DijkstraRun(); return 0; }
算法运行结果如图所示:
相关文章推荐
- ListView优化总结(二)--Android
- JAVA深入研究——Method的Invoke方法
- leetcode刷题。总结,记录,备忘 122
- DFS
- assert()函数用法总结
- 设计4个线程 其中两个线程每次对j增加1
- MYSQL---自定义函数
- [转载] 在Windows上将Apache Portable Runtime (APR)编译为DLL
- Nginx 笔记与总结(4)配置 server 访问日志
- [DT大数据梦工厂]-scala-helloworl的解析
- JS/Jquery的一些技巧
- windows 下常用端口
- 基于Cocos2d-x的英雄联盟皮肤选择菜单
- Android下利用zbar类库实现扫一扫
- iOS Human Interface Guidelines(原创翻译)第三章
- 传苹果今年推iPad mini4 相当于微缩版Air2
- HDU 1372 Knight Moves(BFS)
- SVN添加文件时的错误处理:...\conf\svnserve.conf:12: Option expected
- uva439_骑士的移动
- lucence分词器