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路由术语,跳路 ...
随机推荐
- go语言 rsa加密
// rsa.go package main import ( "crypto/rand" "crypto/rsa" "crypto/x509&quo ...
- 洛谷 P2296 寻找道路【bfs+spfa】
反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...
- springcloud(二) 负载均衡器 ribbon
代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo ribbon是一个负载均衡客户端 类似nginx反向代理,可 ...
- 优先队列 HDOJ 5437 Alisha's Party
题目传送门 题意:一人过生日,很多人排着队送礼物.排队顺序是礼物价值大的优先,如果相等先来的优先.有m次开门,当t个人到了会开门让p个人进门.最后一次让门外的所有人按顺序进门.有q次询问,问第x个进门 ...
- LIS && LCS && LCIS && LPS && MCS模板
1. LIS (Longest Increasing Subsequence) O (n^2): /* LIS(Longest Increasing Subsequence) 最长上升子序列 O (n ...
- mysql 如何创建一个简单的存储过程
1 用mysql客户端登入2 选择数据库 mysql>use test3 查询当前数据库有哪些存储过程 mysql>show procedure status where Db='test ...
- 74LVC2G241双缓冲3态驱动器
- idea 下maven 导入本地jar,以及导入之后 java不能引用问题
1.在当前的项目中新建立一个lib文件夹,将需要导入的jar放入其中. 2.配置pom.xml 文件 <!--导入本地jar--> <dependency> <group ...
- centos安装字体
cd /usr/local/fonts/zh_CN/TrueType/ cp /root/simsunb.ttf /usr/share/fonts/zh_CN/TrueType/ mkfontscal ...
- java (给出年月日,计算该日是该年的第n天 )
package com.ywx.testdemo01; import java.util.Scanner; /** * 题目:给出年月日,计算该日是该年的第n天 * @author yangwenxu ...