算法导论--单源最短路径问题(Dijkstra算法)
来源:互联网 发布:免费手机数据恢复 编辑:程序博客网 时间:2024/06/07 04:53
转载请注明出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51918844
单源最短路径是指:给定源顶点
Dijkstra算法采用贪心策略:按路径长度递增的顺序,逐个产生各顶点的最短路径。算法过程中需要维护一个顶点集
Dijkstra算法思路:
S 初始化时只包括源节点s;
dist[] 初始化:dist[i]= arc[s][i],arc为图的邻接矩阵。
V−S 表示未被找到最短的路径的顶点集合;- 把
dist 按递增的顺序,选择一个最短路径,从V−S 把对应顶点加入到S 中,每次S 中加入一个新顶点u , 需要对dist 更新,即s 能否通过顶点u 达到其他顶点更近。
即若dist[u] + arc[u][v] < dist[v],则更新dist[v]=dist[u]+arc[u][v] - 重复上述步骤,直到
S=V
代码:
/************************************************************************CSDN 勿在浮沙筑高台 http://blog.csdn.net/luoshixian099算法导论--最短路径(Dijkstra算法)2016年7月15日************************************************************************/#include <iostream>#include <vector>#include <queue>#include <algorithm>using namespace std;#define INFINITE 0xFFFFFFFF #define VertexData unsigned int //顶点数据#define UINT unsigned int#define vexCounts 6 //顶点数量char vextex[] = { 'A', 'B', 'C', 'D', 'E', 'F' };void AdjMatrix(unsigned int adjMat[][vexCounts]) //邻接矩阵表示法{ for (int i = 0; i < vexCounts; i++) //初始化邻接矩阵 for (int j = 0; j < vexCounts; j++) { adjMat[i][j] = INFINITE; } adjMat[0][1] = 50; adjMat[0][2] = 10; adjMat[0][4] = 45; adjMat[1][2] = 15; adjMat[1][4] = 10; adjMat[2][0] = 20; adjMat[2][3] = 15; adjMat[3][1] = 20; adjMat[3][4] = 35; adjMat[3][5] = 3; adjMat[4][3] = 30; }void ShortestPath_DJS(unsigned int adjMat[][vexCounts],unsigned int s){ vector<VertexData> vexset; //已经找到最短路径的顶点集 vector<UINT> dist(vexCounts); //没有被找的最短路径的顶点距离信息 vector<vector<VertexData> > path(vexCounts); //每个顶点的最短路径信息 for (unsigned int i = 0; i < vexCounts; i++) { dist[i] = adjMat[s][i]; //初始化距离 if (dist[i] != INFINITE)//s是否有路径到达i { path[i].push_back(s); //把保存最短路径 path[i].push_back(i); } } vexset.push_back(s); //初始把顶点s加入vexset for (unsigned int n = 1; n <= vexCounts-1; n++) { UINT min = INFINITE; UINT k = INFINITE; for (int i = 0; i < vexCounts;i++) //寻找下一条最短路径 { if (find(vexset.rbegin(),vexset.rend(),i) == vexset.rend() && dist[i] < min) { k = i; min = dist[i]; } } vexset.push_back(k); //把最短路径顶点加入vexset中 for (int i = 0; i < vexCounts;i++) //更新dist { /*检测vexset中是否已经有顶点i,即i的最短路径是否已经找到。 如果没有找到,则判定是否需要更新最短路径*/ if (find(vexset.rbegin(), vexset.rend(), i) == vexset.rend() && adjMat[k][i] != INFINITE && dist[k]+ adjMat[k][i] < dist[i]) { dist[i] = dist[k] + adjMat[k][i]; path[i] = path[k]; path[i].push_back(i); } }; /*便于观察,输出每个顶点的最短路径经过的所有其他顶点及其距离*/ cout << "Path: "; for (int i = 0; i < path[k].size();i++) { cout << vextex[path[k][i]] << ","; } cout << " 距离="<<dist[k]<<endl; }}int main(){ unsigned int adjMat[vexCounts][vexCounts] = { 0 }; AdjMatrix(adjMat); //邻接矩阵 cout << "Dijkastra : A" << endl; //计算顶点A的最短路径 ShortestPath_DJS(adjMat, 0); //Djikstra算法,A的序号为0. return 0;}
Reference:
数据结构-耿国华
算法导论-第三版
1 0
- 算法导论--单源最短路径问题(Dijkstra算法)
- 算法导论 单源最短路径 Dijkstra
- 【算法导论】单源最短路径之Dijkstra算法
- [算法导论] 单源最短路径 - Dijkstra 学习笔记
- 贪心算法------单源最短路径问题(Dijkstra)
- 单源最短路径问题-迪杰斯特拉(Dijkstra)算法
- 单源最短路径问题 Dijkstra算法
- 算法导论-单源最短路径-Dijkstra算法的实现
- 算法导论-第24章- 单源最短路径 - 24.3 Dijkstra 算法
- 算法导论学习笔记(18)——单源最短路径(Dijkstra算法实现)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- 单源最短路径(Dijkstra算法)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Date型数据比较时间前后
- linux下安PHP开发环境
- Web Service 的工作原理
- tomcat集成quartz
- java的序列化
- 算法导论--单源最短路径问题(Dijkstra算法)
- DMA-BUF API使用指南
- RK平台RAM和ROM容量计算
- rails AJAX方法 操作后需要执行js文件中命令的方法
- HDU 2111 Saving HDU
- Python行读取文件进行拷贝
- Codeforces 689D. Friends and Subsequences(二分/尺取 + ST表)
- 积木游戏 纪中 1440 类dp 预处理
- android RecyclerView的简单用法