单源最短路径(Dijkstra算法)
2017-05-31 22:14
225 查看
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中。
(图片来源于网络)
关键代码:
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[] , int v0, int dist[], int prev[]) { int s ; 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; else prev[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; } } } } }
相关文章推荐
- 单源最短路径复习--Dijkstra算法和Floyd算法
- 单源最短路径算法--Dijkstra算法和Bellman-Ford算法
- 单源最短路径算法--Dijkstra算法和Bellman-Ford算法
- 求单源最短路径的Dijkstra算法分析与实现
- 单源最短路径问题——Dijkstra算法
- 【算法——Python实现】有权图求单源最短路径Dijkstra算法
- 图论——单源最短路径算法之Dijkstra算法
- 求图的邻接表表示法的单源最短路径 Dijkstra算法
- C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
- Dijkstra算法是解单源最短路径问题的一个贪心算法
- 单源最短路径:Dijkstra算法
- 单源最短路径问题 Dijkstra算法
- 最短路径基本介绍(2)--Dijkstra算法(单源最短路径算法)
- Dijkstra算法(单源最短路径)
- Dijkstra算法(单源最短路径)
- Pku acm 1062 昂贵的聘礼 数据结构题目解题报告(七)—单源最短路径:Dijkstra算法
- Dijkstra算法(单源最短路径)
- 杭电 1874 单源最短路径 Dijkstra算法
- Dijkstra算法(单源最短路径)
- Dijkstra算法求单源最短路径