单源最短路径(Dijkstra算法)
来源:互联网 发布:华西电子盘软件下载 编辑:程序博客网 时间:2024/05/19 18:44
Dijkstra:迪杰斯特拉
Dijkstra算法是解单源最短路径问题的贪心算法。其基本思想是,设置顶点集合点集合S并不断地做贪心选择来扩充这个集合。
算法步骤:
(1)初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。
(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值为顶点k的距离加上顶点k到u边上的权。
(4)重复步骤b和c直到所有顶点都包含在S中。
(图片来源于网络)
关键代码:
//参数:邻接矩阵、源顶点、当前每个顶点所对应的最短特殊路径长度、路径前一点记录void Dijkstra(int matrix[][N], int v0, int dist[], int prev[]){int s[N];int i,j,k;int mindis,dis;//初始化for(i=1;i<=n;i++){dist[i]=matrix[v0][i];s[i]=false;if(dist[i] == M)prev[i]=0;elseprev[i]=v0;}dist[v0]=0;s[v0] =1; //标记v0//在当前还未找到最短路径的顶点中寻找具有最短距离的路径for(i=1;i<N;i++){mindis=M;int u=v0;for(int j=1;i<=n;j++) //求离出发点最近的顶点{if(s[j]==0 && dist[j]<mindis){mindis = dist[j];u=j;}}s[u]=true;for(j=1;j<=n;j++) //修改递增路径序列(集合){if(s[j]==0 && matrix[u][j]<M) //还未求得最短路径的顶点{dis = dist[u] + matrix[u][j];if(dist[j]>dis){dist[j]=dis;prev[j]=u;}}}}}
阅读全文
0 0
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- 单源最短路径(Dijkstra算法)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- DijKstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- 单源最短路径(dijkstra算法)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- 单源最短路径(Dijkstra)算法
- Dijkstra算法(单源最短路径)
- JSON
- ActiveMQ的简介与安装
- Dinic 清真模板(数组类型 + 当前弧优化)Poj—1273
- 命运多舛,霉运连连。
- NOJ2211解题笔记
- 单源最短路径(Dijkstra算法)
- 论考试的题目应该是多少年前的原题-解题报告
- 分析Java 堆
- 网络层次分析
- Codeforces Round #416 (Div. 2)-C. Vladik and Memorable Trip
- Kotlin编程之if语句,while循环,when表达式,for循环
- VS2013使用本地GIT管理源代码
- Problem D: 不同交通工具的速度
- 动态代理和IBinder机制