Dijkstra迪杰斯特拉算法及C++实现

Dijkstra算法是典型的最短路径路由算法,用来计算一个节点到其他所有节点的最短路径。算法的基本思想和流程是:
1. 初始化出发点到其它各点的距离dist[]以及各点的前一个访问点pre[];
2. for(i=2…n){
  找出dist[]中未访问过点中的最小值,记录为best;
  以dist[best]为基准更新dist[];
  更新pre[];
}

从1出发,第一次找到最小点2,更新dist[],然后找到最小点4,以此类推,以当前最小为最优(贪心算法),列出下表:

迭代次数 s best dist[2] dist[3] dist[4] dist[5]
1(初始化) {1} - 10 max 30 100
2 {1,2} 2 10 60 30 100
3 {1,2,4} 4 10 50 30 90
4 {1,2,4,3} 3 10 50 30 60
5 {1,2,4,3,5} 5 10 50 30 60

具体实现:

#include <iostream>
#include <vector>
const int maxdist = 114514;
using namespace std;
/*n是总的结点数,v是出发结点,dist是距离,pre前一个结点,d是结点间的权值*/
void Dijkstra(int n, int v, vector<int> &dist, vector<int> &pre, vector<vector<int>> &d){
vector<bool> s(n+1);
for (int i = 1; i <= n;i++){
dist[i] = d[v][i];
if (dist[i] < maxdist)
pre[i] = v;
else
pre[i] = 0;
}
dist[v] = 0;
s[v] = true;
for (int i = 2; i <= n;i++){//总迭代次数
int best = v;
int temp = maxdist;
for (int j = 1; j <= n;j++){//找到最小的距离
if (!s[j]&&dist[j]<temp){
temp = dist[j];
best = j;
}
}
s[best] = true;
for (int j = 1; j <= n;j++){//更新dist和pre
if (!s[j] && d[best][j] != maxdist){
int newdist = dist[best] + d[best][j];
if (newdist<dist[j]){
dist[j] = newdist;
pre[j] = best;
}
}
}
}
} void printpath(vector<int> pre, int init, int fina){
int temp=fina;
vector<int> t;
while (temp != init){
t.push_back(temp);
temp = pre[fina];
fina = temp;
}
cout << init << "->";
for (int i = t.size(); i >1;i--)cout << t[i-1] << "->";
cout << t[0];
t.clear();
}
int main(){
int n, l;
cout << "请输入结点数和线数:";
cin >> n >> l;
vector<vector<int>> d(n+1, vector<int>(n+1));
for (int i = 1; i <= n;i++){
for (int j = 1; j <= n; j++)
d[i][j] = maxdist;
}
int p, q, len;
for (int i = 1; i <= l; ++i){
cin >> p >> q >> len;
if (len < d[p][q]){ // 有重边
d[p][q] = len; // p指向q
d[q][p] = len; // q指向p,这样表示无向图
}
}
vector<int> dist(n+1),pre(n+1);
for (int i = 1; i <= n; ++i)dist[i] = maxdist;
Dijkstra(n, 1, dist, pre, d);
cout << "点1到点n的最短路径长度: " << dist[n] << endl;
cout << "点1到点n的路径为: ";
printpath(pre, 1, n);
return 0;
}

Dijkstra(迪杰斯特拉)算法C++实现&讲解的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. 图解Dijkstra(迪杰斯特拉)算法+代码实现

    简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...

  3. (Dijkstra)迪杰斯特拉算法-最短路径算法

    迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...

  4. Dijkstra(迪杰斯特拉)算法求解最短路径

    过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...

  5. C# 迪杰斯特拉算法 Dijkstra

    什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...

  6. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

    Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...

  7. Dijkstra【迪杰斯特拉算法】

    有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

  8. 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)

    文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...

  9. 最短路问题:迪杰斯特拉算法(Dijsktra)

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  10. 最短路之Dijkstra(迪杰斯特拉)

    一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代 ...

随机推荐

  1. 如何为linux kernel贡献代码

    参考: Linux内核文档:<如何让你的改动进入内核> - 广漠飘羽 - 博客园 提交内核补丁到Linux社区的步骤 - 广漠飘羽 - 博客园 建议: 内容具有时效性,需要阅读最新版本的同 ...

  2. Java基础|01.基础语法(1)

    目录 00x1 基本语法 1.类的语法 2.对象的语法 3.方法的声明 4.小例子 00x2 类和对象的关系 1.堆.栈和元空间 2.基本数据类型和引用数据类型的区别 3. 空对象(null) 00x ...

  3. scanf 读入 string 注意点

    在做题的时候需要读入字符串,但是又不想使用char 数组,于是采用string存储,当时遇到了scanf读取string失败,查阅资料后总结下. scanf是c的标准输入输出流,想要读入string, ...

  4. 励志成为python大佬的第一天

    1.编码 2.格式化字符 3.list,dict,tuple,set 4.return 5.参数

  5. Shell写脚本关于ssh执行jar包,需要刷新JDK路径的问题

    比如脚本中下面这一段 ssh $i "java -jar /applog/$PROJECT/$APPNAME --server.port=$SERVER_PORT >/dev/null ...

  6. sql创建表时候单引号不是单引号是,而是Esc下面的按键

    CREATE TABLE `test`.`testmd5` ( `id` INT ( 4 ) NOT NULL, `name` VARCHAR ( 20 ) NOT NULL, `pwd` VARCH ...

  7. 让 rtb 不显示 横纵 滚动条的方法

    让 rtb 不显示 横纵 滚动条的方法: a.设置属性: tb.ScrollBars=None; b.设置属性:rtb.WordWarp=False; c. 添加事件代码: rtb.ContentsR ...

  8. idea初学

    IDEA 什么是IDE IDEA官网 idea中文设置:打开右上角设置选择设置,选择Plugins ,搜索Chinese,安装插件后重启即可 IDEA基础语法 注释 编写代码量多时,项目结构复杂,需要 ...

  9. input_subsys 输入子系统框架分析

    在linux内核中 已做好各类驱动的框架,驱动程序也属于内核的一部分,我们可以在原有的驱动上修改,来匹配我们自已的硬件,也可以自已编写符合内核驱动框架的驱动程序.出于学习的目的,便于更好的理解各类驱动 ...

  10. mysql安装调试

    mysql安装 1.下载mysql的压缩包 tar -xvzf mysql-5.6.38-linux-glibc2.12-i686.tar.gz2.安装之后密码是随机的,所以我们需要重新修改密码: [ ...