Dijkstra算法
来源:互联网 发布:网络棋牌室代理 编辑:程序博客网 时间:2024/05/29 14:47
本文简要介绍Dijkstra算法,该算法用于解决带权重的有向图上的单源最短路经问题,要求所有边的权重都是非负值。
- 主要思想:
该算法的主要思想是维护两个节点集合S 和V−S ,其中S 中的点与源点之间的最短路径已经被找到,而V−S 是尚未找到最短路径的点的集合(其中V 是所有节点的集合)。算法重复地从集合S 中选取最短路径估计值最小的点u ,并将u 加入集合S ,然后对所有从u 出发的边进行松弛,直到所有点被加入集合S 。 - 算法的初始化说明
在该算法中,首先将源点加入集合S ,并将源点的最短路径长度设置为0,而其它节点的最短路径估计设置为无穷大。 实例
本文使用 算法导论 一书中的实例来编程实现Dijkstra算法,实例如下图所示:编程实现:
#include <iostream>using namespace std;int A[1000][1000];int dis[1000], Forward[1000];bool isSearch[1000];int i, j, k, len, source, destination, V, E;void dijkstra( int source){ //将源点加入已找到最短路的点的集合 //u也是连接已找到最短路点的集合和未找到最短路的点的集合的中介点 int u = source; dis[u] = 0; Forward[u] = 0; isSearch[u] = 1; //寻找与u邻接的点,并松弛相应的边 for(k = 1; k < V; k++) { for(i = 1; i < V; i++) { if(A[u][i] != 0x7fffffff && isSearch[i] == 0) { //松弛(u,i)这条边 if(dis[i] > dis[u] + A[u][i]) { dis[i] = dis[u] + A[u][i]; Forward[i] = u; } } } //寻找新的u加入已找到最短路的点的集合 int ss = 0x7fffffff; for(i = 0; i < V; i++) if(isSearch[i] == 0 && dis[i] < ss) { ss = dis[i]; u = i; } isSearch[u] = 1; }}void printPath(int Forward[], int source, int destination){ if(destination == source) cout << source; else { printPath(Forward, source, Forward[destination]); cout << "->" << destination; }}int main(){ cin >> V >> E >> source >> destination;//顶点数,边数, 源点, 目标点 for(i = 0; i < V; i++) for(j = 0; j < V; j++) A[i][j] = 0x7fffffff; for(i = 0; i < V; i++) dis[i] = 0x7fffffff; for(i = 0; i < V; i++) Forward[i] = 0x7fffffff; for(k = 0; k < E; k++) { cin >> i >> j >> len; A[i][j] = len; } dijkstra(source); cout << "the distance from " << source << " to " << destination << " is: " << dis[destination] << endl; cout << "the path is: "; printPath(Forward, source, destination); cout << endl; return 0;}
- 结果如下:
阅读全文
0 0
- Dijkstra算法
- dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra 算法
- dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- dijkstra算法
- [luogu1558][POJ2777]Count Color(线段树+二进制操作)
- activemq操作示例
- 《linux C语言结构体》笔记
- JavaScript 正则表达式常用的转义符
- NGINX + LUA实现复杂的控制
- Dijkstra算法
- MFC一一拆分窗口类CSplitterWnd
- CentOS 7下使用yum工具安装MySQL 5.7数据库
- getServletContext()方法详解
- 实现Action
- 微信小程序使用JS隐藏view,结合css语法处理
- 计算机网络笔记
- 注册时后台验证UserAction-regUser-validation.xml
- Android_viewpager适配器