【Dijkstra】最短路径
复习笔记【一】 Dijkstra算法
算法核心:对边的松弛
概述:Dijkstra用于求一个点到其他点的最短路径,不适合于负边权,用了贪心思想,复杂度为O(N^2), 与SPFA相比其优点是经堆优化后Dijkstra的时间复杂度为O(NlogN),和最小生成树Prim算法长的很像...
理解:假设我们要计算从一号点出发,一号点到其他点的最短路径。首先,定义一个一维数组distance,distance[J]表示从1号点到J号点的初始路程,假如说两点之间没有边,那我们就假设其两点间的初始路程为正无穷,因为两点可能永远无法到达~
此时distance中存储了一号点到各顶点的距离(假如说有边的话就是边权, 没边就是正无穷)
假如说对于如下数据:
4 4 //四个顶点四条边
1 2 3
1 3 6
2 3 1
2 4 2
distance[i] | i = 1 | i = 2 | i = 3 | i = 4 |
value | 0 | 3 | 6 | 无穷大 |
显然,其到自身的距离为0。
1号点与2号点间有边相连,其边权为3
同理:distance[1][3] = 6
Edge[1][4]不存在, distance[1][4] = 正无穷
此时选取其中最小的distance, 这就是1号结点到被选取的这个点的最短路径了,
distance[2] = 3,所以 到 2号结点的最短距离为3, 因为不可能通过第二条边来让其到1号结点的距离更近(仔细想..)
此时再遍历与2号结点相连的边,如果1号结点到k号结点的距离 > 1号结点的距离到2号结点的距离 + 2号结点到k号结点的距离就更新distance,再然后,选取distance中最小的(可以用堆优化的地方),再以最小的点进行遍历....
总结:
1.初始化distance数组和标记数组
for (int i = 1; i <= n; i++) {distance[i] = edge[1][i]; //edge[1][I]为邻接矩阵存储方式 flag[i] = false; //表示i号结点是否已经被标记为最短路,防止重复遍历 } flag[1] = true;
2.核心语句
for (int i = 1, min, u; i <= n - 1; i++) {min = 0x7fffffff;for (int j = 1; j <= n; j++) {if (!flag[[j] && distance[j] < min) {min = distance[j]; //选取最小的distance u = j;}}flag[u] = true;for (int k = 1; k <= n; k++) {//如果有边 if (edge[u][v] < 0x7fffffff) {if (distance[v] > distance[u] + edge[u][v]) {distance[v] = distance[u] + edge[u][v]}}} }for (int i = 1; i <= n; i++) {printf ("%d ", distance[i]); }
完整代码
#include <cstdio> #include <queue> #include <limits.h> #define maxn 1005struct Node {int diktc; bool visited;struct Edge* edges;bool operator () (const Node *a, const Node *b) {return a->diktc > b->diktc;}Node () : diktc (INT_MAX) , visited (false) {} } nodes[maxn];struct Edge {int weight;Node* to;Edge* next;Edge () {}Edge (int w, Node* t) : weight (w), to(t) {} };inline void EdgeMaker (const int &u, const int &v, const int &w) {Edge* curEdge = new Edge(w, nodes + v);curEdge->next = nodes[u].edges;nodes[u].edges = curEdge; }inline void EdgeDestory (const int& n) {for (int i = 0; i < n; i++) {Edge* curEdge = nodes[i].edges;while (curEdge != NULL) {Edge* tmp = curEdge;curEdge = curEdge->next;delete[] tmp;}} }int n, m;inline void Dijkstra (const int &start) {std::priority_queue<Node*, std::vector<Node*>, Node > pq;Edge *curEdge = nodes[start].edges;while (curEdge != NULL) {curEdge->to->diktc = curEdge->weight;pq.push (curEdge->to);curEdge = curEdge->next;}nodes[start].diktc = 0;nodes[start].visited = true;for (int i = 0; i < n; i++) {pq.push (nodes + i);}for (int i = 0, u; i < n - 1; i++) {while (pq.top()->visited) {pq.pop();}u = pq.top() - nodes;pq.pop();nodes[u].visited = true;curEdge = nodes[u].edges;while (curEdge != NULL) {if (curEdge->to->diktc > nodes[u].diktc + curEdge->weight) {curEdge->to->diktc = nodes[u].diktc + curEdge->weight;pq.push (curEdge->to);}curEdge = curEdge->next;}}for (int i = 1; i <= n; i++) {printf ("%d ", nodes[i].diktc);}printf ("\n"); }int main () {scanf("%d %d", &n, &m);for (int i = 0, u, v, w; i < m; i++) {scanf ("%d %d %d", &u, &v, &w);EdgeMaker (u, v, w);// EdgeMaker (v, u, w); }Dijkstra (1);EdgeDestory (n);return 0;}
转载于:https://www.cnblogs.com/uedge/p/5716424.html
【Dijkstra】最短路径相关推荐
- LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)
文章目录 1. 题目 2. 解题 2.1 BFS 2.2 Dijkstra 最短路径 1. 题目 由空地和墙组成的迷宫中有一个球. 球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动. 当球停下 ...
- aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)
「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...
- Dijkstra最短路径算法——java代码实现
具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...
- matlab工具箱计算最小生成树_matlab_bgl 图论基本函数库, 相当丰富.包含工具箱、 、Dijkstra最短路径、 254万源代码下载- www.pudn.com...
文件名称: matlab_bgl下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 7394 KB 上传时间: 2016-03-30 下载次数: 0 详细说明: ...
- c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法
迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...
- 算法学习(10):LeetCode刷题之Dijkstra最短路径算法
前言: 迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径."图"这种数据结构的具体实现就是"邻接矩阵"或者"邻接 ...
- 算法分析与设计课程设计-Dijkstra最短路径算法
算法分析与设计课程设计报告书 题目:Dijkstra最短路径算法 设计人:张钦颖 班级:14计科2班 学号:1414080901218 一. 实验环境: 1.硬件环境:个人机 ...
- python 深度优先最短路径,广度优先最短路径,dijkstra最短路径及可视化
简要说明 通过使用python实现图的可视化,以及广度优先的最短距离,深度优先的最短路径,dijkstra的最短路径 dijkstra最短路径 深度优先最短路径 深度优先忘记标路径的边及方向 广度优先 ...
- dijkstra最短路径算法视频_java实现Dijkstra算法求最短路径
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方 ...
- Dijkstra 最短路径算法详解 无向图
对于最短路径问题,这里介绍一种O(N^2)的求解方法. 对于求最短路径的问题一般都会给出一幅图,或者边与边的关系.如上图. 假设我们起点是A,我们要求到F的最短距离,我们会怎么做? 首先,因为 ...
最新文章
- CSDN如何快速转载别人的博客(附简单详细方法)
- java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...
- wordpress配置SMTP服务发送邮件
- linux自学笔记--vim和文本三剑客基础
- GPUImageMovieWriter录制视频问题
- vue.js ajax怎么用,vue.js中ajax的使用
- 基于RV1126平台imx291分析 --- media部件连接 二
- python查找手册
- tdscdma的matlab仿真,基于MATLAB的TDSCDMA调制解调仿真
- 使用xmarks同步 chrome ie firefox safari书签
- 图注意力网络GRAPH ATTENTION NETWORKS(gat)浅读
- 软件安全技术(概述、堆栈漏洞)总结
- 2022年腾讯课堂现在用m3u8下载不了,怎么办
- 计算机专业不用学数学的有什么,大学里不用学数学的专业,不想学高数的看过来,你的专业是哪个...
- jQuery 实现动态粒子特效,太美了!!!
- 百度ueditor编辑器如何使用自定义的高大上高亮皮肤?
- idea火箭_火箭的大脑
- vscode的vue代码提示与补全没反应(vetur问题)
- 高防服务器好,还是游戏盾好?
- ncut算法python实现
热门文章
- 关于IT企业如何建立内部wiki
- java表达式类型自动提升
- poj 3692(二分图匹配--最大独立集)
- 消费者关注的 Win8 问题汇总(下)
- 五分钟学会HTML5!(二)
- 在应用程序中宿主MEF
- mysql my.cnf 找不到_为什么我在mysql的my.cnf下找不到bind-address?
- android 结束if循环_Android Handler 消息循环机制
- 极客大挑战2020_五省同燃,千人开赛。2020年全国轮滑大联动暨MX名星轮滑伴我行城市轮滑挑战赛——扬州站、襄阳站、南宁站、潍坊站、沈阳站完美收官...
- 利用DNS Zone Transfers漏洞工具dnswalk