Dijkstra算法简单实现(C++)
图的最短路径问题主要包括三种算法:
(3)Bellman (含有负权边的单源最短路径)
本文主要讲使用C++实现简单的Dijkstra算法
Dijkstra算法简单实现(C++)
#include<iostream>
#include<stack>
using namespace std; #define MAXVEX 9
#define INFINITY 65535 typedef int Patharc[MAXVEX];
typedef int ShortPathTable[MAXVEX]; typedef struct {
int vex[MAXVEX];
int arc[MAXVEX][MAXVEX];
int numVertexes;
} MGraph; // 构建图
void CreateMGraph(MGraph *G){
int i, j, k;
// 初始化图
G->numVertexes = ;
for(i = ; i < G->numVertexes; ++i){
G->vex[i] = i;
}
for(i = ; i < G->numVertexes; ++i){
for(j = ; j < G->numVertexes; ++j){
if(i == j)
G->arc[i][j] = ;
else
G->arc[i][j] = G->arc[j][i] = INFINITY;
}
} G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ; G->arc[][] = ;
G->arc[][] = ; G->arc[][] = ; // 设置对称位置元素值
for(i = ; i < G->numVertexes; ++i){
for(j = i; j < G->numVertexes; ++j){
G->arc[j][i] = G->arc[i][j];
}
}
} void ShortPath_Dijkstra(MGraph G, int v0, Patharc P, ShortPathTable D){
int final[MAXVEX];
int i;
for(i = ; i < G.numVertexes; ++i){
final[i] = ;
D[i] = G.arc[v0][i];
P[i] = ;
}
D[v0] = ;
final[v0] = ;
for(i = ; i < G.numVertexes; ++i){
int min = INFINITY;
int j, k, w; for(j = ; j < G.numVertexes; ++j){// 查找距离V0最近的顶点
if(!final[j] && D[j] < min){
k = j;
min = D[j];
}
}
final[k] = ;
for(w = ; w < G.numVertexes; ++w){// 更新各个顶点的距离
if(!final[w] && (min + G.arc[k][w]) < D[w]){
D[w] = min + G.arc[k][w];
P[w] = k;
}
}
}
} // 打印最短路径
void PrintShortPath(MGraph G, int v0, Patharc P, ShortPathTable D){
int i, k;
stack<int> path;
cout<<"顶点v"<<v0<<"到其他顶点之间的最短路径如下: "<<endl;
for(i = ; i < G.numVertexes; ++i){
if(i == v0) continue;
cout<<"v"<<v0<<"--"<<"v"<<i<<" weight: "<<D[i]<<" Shortest path: ";
path.push(i);
int k = P[i];
while(k != ){
path.push(k);
k = P[k];
}
path.push(v0);
while(!path.empty()){
if(path.size() != )
cout<<path.top()<<"->";
else
cout<<path.top()<<endl;
path.pop();
}
}
} int main(int argc, char const *argv[]) {
int v0 = ; // 源点
MGraph G;
Patharc P;
ShortPathTable D;
CreateMGraph(&G);
ShortPath_Dijkstra(G, v0, P, D);
PrintShortPath(G, v0, P, D);
return ;
}
运行结果
顶点v0到其他顶点之间的最短路径如下:
v0--v1 weight: Shortest path: ->
v0--v2 weight: Shortest path: ->->
v0--v3 weight: Shortest path: ->->->->
v0--v4 weight: Shortest path: ->->->
v0--v5 weight: Shortest path: ->->->->
v0--v6 weight: Shortest path: ->->->->->
v0--v7 weight: Shortest path: ->->->->->->
v0--v8 weight: Shortest path: ->->->->->->->
[Finished in .8s]
参考资料
Dijkstra's algorithm, Wikipedia
Dijkstra算法简单实现(C++)的更多相关文章
- 算法笔记_068:Dijkstra算法简单介绍(Java)
目录 1 问题描述 2 解决方案 2.1 使用Dijkstra算法得到最短距离示例 2.2 具体编码 1 问题描述 何为Dijkstra算法? Dijkstra算法功能:给出加权连通图中一个顶点, ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 单源最短路径——Dijkstra算法学习
每次都以为自己理解了Dijkstra这个算法,但是过没多久又忘记了,这应该是第4.5次重温这个算法了. 这次是看的胡鹏的<地理信息系统>,看完之后突然意识到用数学公式表示算法流程是如此的好 ...
- [图论]Dijkstra 算法小结
Dijkstra 算法小结 By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...
- 单源最短路径——dijkstra算法
dijkstra算法与prim算法的区别 1.先说说prim算法的思想: 众所周知,prim算法是一个最小生成树算法,它运用的是贪心原理(在这里不再证明),设置两个点集合,一个集合为要求的生成树的 ...
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
- 单源最短路径—Bellman-Ford和Dijkstra算法
Bellman-Ford算法:通过对边进行松弛操作来渐近地降低从源结点s到每个结点v的最短路径的估计值v.d,直到该估计值与实际的最短路径权重相同时为止.该算法主要是基于下面的定理: 设G=(V,E) ...
- C# 迪杰斯特拉(Dijkstra)算法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...
- 互联网IP合全局路由优化的原则-Dijkstra算法证明
周末继续写东西的一半填补了,为了达到完美的一天.我们知道一个事实,IP地址太多.统一管理是不可能的了,无论从控制平面从数据/管理层表示,飞机是如此. 所以.IP协议被设计为可伸缩.供IP路由术语,跳路 ...
随机推荐
- 分析spring aop的源码实现
AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. spring AOP是Sp ...
- php in_array 的 坑
话不多说,直接上代码 $str = '7.php'; var_dump(in_array($str,range(0,100))); die; 是 true 这是因为 php是弱类型语言,会把7.php ...
- Centos6.8 搭建Lvs+Keepalived
Keepalived keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层.第4层和第7层交换.Keepalived是自动完成,不需人工干涉. 简 ...
- Oracle 单引号与双引号的区别
双引号一般是用来转义的,如果alias里面有空格或其它保留符号,必须使用双引号.而单引号是用来特制的,比如字符串的引用,日期字符串的引用,都必须包括在单引号中,可以参与运算或其它表达式中.两者不可混用 ...
- jquery html() 和text()的用法
html()类似JS中的 innerHTML,首先看一段代码: <!DOCTYPE html> <html lang="en"> <head> ...
- nginx memcache缓存
1 基本 在一个lnmp架构中,nginx遇到动态资源,会反向代理,把请求发送到后端的php-fpm服务,php-fpm从mysql里读取数据,生产网页,然后返回给client. 如果流量大,php- ...
- websocket实现群聊
server # @File: 群聊 from flask import Flask, render_template, request from geventwebsocket.handler im ...
- docker监控之cadvisor
docker run -d \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --vo ...
- jQuery选择器之可见性选择器
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- 【学习笔记】深入理解js原型和闭包(1)—— 一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的运算符——typeof.typeof ...