复习笔记【一】 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】最短路径相关推荐

  1. LeetCode 505. 迷宫 II(BFS / Dijkstra 最短路径)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 Dijkstra 最短路径 1. 题目 由空地和墙组成的迷宫中有一个球. 球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动. 当球停下 ...

  2. aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)

    「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...

  3. Dijkstra最短路径算法——java代码实现

    具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...

  4. matlab工具箱计算最小生成树_matlab_bgl 图论基本函数库, 相当丰富.包含工具箱、 、Dijkstra最短路径、 254万源代码下载- www.pudn.com...

    文件名称: matlab_bgl下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 7394 KB 上传时间: 2016-03-30 下载次数: 0 详细说明: ...

  5. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  6. 算法学习(10):LeetCode刷题之Dijkstra最短路径算法

    前言: 迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径."图"这种数据结构的具体实现就是"邻接矩阵"或者"邻接 ...

  7. 算法分析与设计课程设计-Dijkstra最短路径算法

    算法分析与设计课程设计报告书       题目:Dijkstra最短路径算法 设计人:张钦颖 班级:14计科2班    学号:1414080901218 一.     实验环境: 1.硬件环境:个人机 ...

  8. python 深度优先最短路径,广度优先最短路径,dijkstra最短路径及可视化

    简要说明 通过使用python实现图的可视化,以及广度优先的最短距离,深度优先的最短路径,dijkstra的最短路径 dijkstra最短路径 深度优先最短路径 深度优先忘记标路径的边及方向 广度优先 ...

  9. dijkstra最短路径算法视频_java实现Dijkstra算法求最短路径

    Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方 ...

  10. Dijkstra 最短路径算法详解 无向图

    对于最短路径问题,这里介绍一种O(N^2)的求解方法.    对于求最短路径的问题一般都会给出一幅图,或者边与边的关系.如上图. 假设我们起点是A,我们要求到F的最短距离,我们会怎么做?  首先,因为 ...

最新文章

  1. CSDN如何快速转载别人的博客(附简单详细方法)
  2. java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...
  3. wordpress配置SMTP服务发送邮件
  4. linux自学笔记--vim和文本三剑客基础
  5. GPUImageMovieWriter录制视频问题
  6. vue.js ajax怎么用,vue.js中ajax的使用
  7. 基于RV1126平台imx291分析 --- media部件连接 二
  8. python查找手册
  9. tdscdma的matlab仿真,基于MATLAB的TDSCDMA调制解调仿真
  10. 使用xmarks同步 chrome ie firefox safari书签
  11. 图注意力网络GRAPH ATTENTION NETWORKS(gat)浅读
  12. 软件安全技术(概述、堆栈漏洞)总结
  13. 2022年腾讯课堂现在用m3u8下载不了,怎么办
  14. 计算机专业不用学数学的有什么,大学里不用学数学的专业,不想学高数的看过来,你的专业是哪个...
  15. jQuery 实现动态粒子特效,太美了!!!
  16. 百度ueditor编辑器如何使用自定义的高大上高亮皮肤?
  17. idea火箭_火箭的大脑
  18. vscode的vue代码提示与补全没反应(vetur问题)
  19. 高防服务器好,还是游戏盾好?
  20. ncut算法python实现

热门文章

  1. 关于IT企业如何建立内部wiki
  2. java表达式类型自动提升
  3. poj 3692(二分图匹配--最大独立集)
  4. 消费者关注的 Win8 问题汇总(下)
  5. 五分钟学会HTML5!(二)
  6. 在应用程序中宿主MEF
  7. mysql my.cnf 找不到_为什么我在mysql的my.cnf下找不到bind-address?
  8. android 结束if循环_Android Handler 消息循环机制
  9. 极客大挑战2020_五省同燃,千人开赛。2020年全国轮滑大联动暨MX名星轮滑伴我行城市轮滑挑战赛——扬州站、襄阳站、南宁站、潍坊站、沈阳站完美收官...
  10. 利用DNS Zone Transfers漏洞工具dnswalk