Dijkstra(迪杰斯特拉)算法C++实现&讲解
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++实现&讲解的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- (Dijkstra)迪杰斯特拉算法-最短路径算法
迪杰斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想:设G=(V,E)是一个带权有向图 ...
- Dijkstra(迪杰斯特拉)算法求解最短路径
过程 首先需要记录每个点到原点的距离,这个距离会在每一轮遍历的过程中刷新.每一个节点到原点的最短路径是其上一个节点(前驱节点)到原点的最短路径加上前驱节点到该节点的距离.以这个原则,经过N轮计算就能得 ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...
- Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 最短路问题:迪杰斯特拉算法(Dijsktra)
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
- 最短路之Dijkstra(迪杰斯特拉)
一般用法: Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代 ...
随机推荐
- linux 基线检查
1 检查用户缺省UMASK #cat /etc/profile|sed '/^#/d'|sed '/^$/d'|grep -i "umask" 修改umask vi /etc/pr ...
- iOS学习十一之步进控制器UIStepper
步进控制器也就是进行离散式数据调节的常用视图控件. 在viewDidLoad()方法中加入下面的方法,即可完成基本功能. override func viewDidLoad() { super.vie ...
- 新手IC617安装NCSU pdk
新手IC617安装NCSU cdk 以CMOSedu网站为参考:https://cmosedu.com/videos/cadence/tutorial1/cadence_tutorial_1.htm ...
- Python 去掉文本内容中的\xa0字符
爬取网页时,不可避免会遇到\xa0字符串,就会发现,正则re.sub(r'\xa0', '')和字符串的replace都不管用. 通常地,我们所用的空格的ASCII码是 \x20 ,是在标准ASCII ...
- Linux安装ODBC连接SQLServer数据库
操作系统:Centos7.2 1.下载ODBC安装包 unixODBC-2.3.9.tar.gz freetds-1.3.9.tar.gz 下载这两个压缩包的地址:ftp://ftp.freetds. ...
- Matlab %伍
第五章:初级绘图进阶 Special Plots loglog semilogx semilogy plotyy hist bar pie polar Logarithm Plots x = lo ...
- 使用Eclipse快速开发jsp和.编码问题、JSP页面元素以及request对象
在IDEA中创建的Web项目: 浏览器可以直接访问WebContent中的文件. 例如http:// localhost:8888/MyJspProject/index1.jsp其中的index1.j ...
- 虚拟机文件丢失,虚拟机无法启动,通过xx-flat.vmdk和xx-delta.vmdk恢复虚拟机
突然掉电,导致虚拟机文件夹里面的文件丢失,只剩余-flat.vmdk和-delta.vmdk文件,其他文件全部丢失,文件格式原本为"文件"格式.新建虚拟机无法直接使用此文件夹里面的 ...
- virsh虚拟机使用网桥来实现上网
使用virsh-install安装虚拟机后,虚拟机不可以上网 第一步:主机上配置网桥 cp ifcfg-eno16777736 /tmp/ cp ifcfg-eno16777736 ifcfg ...
- 有时候用uniapp写项目时发现,Map组件在安卓真机可以缩放和移动,但是在ios真机就不行
如果你的地图组件是放到popup组件里,是用弹框打开的,如何ios端不能缩放, 那你一定要看下这个弹框的层级是否比地图层级要高 z-index. 如果高于地图层级,那地图肯定是不能移动和缩放的