迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊。。。
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
让我来翻译一下:
Dijkstra可以求出一个点到一个图中其他所有节点的最短路径,故也称对于单源最短路径的一种解法
算法实现步骤:
a.初始时,只包括源点,即S = {v},v的距离为0。U包含除v以外的其他顶点,即:U ={其余顶点},若v与U中顶点u有边,则(u,v)为正常权值,若u不是v的出边邻接点,则(u,v)权值 ∞;
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
动画模拟:
普通版Dijkstra代码如下:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cstring>
- using namespace std;
- int map[][];
- int vis[];
- int way[];
- int n,e,w,s;
- int main(){
- freopen("dij.in","r",stdin);
- freopen("dij.out","w",stdout);
- int i,j,x,y,z,w,mi=;
- scanf("%d%d",&n,&e);
- for(i=;i<=e;i++)
- {
- scanf("%d%d%d",&x,&y,&z);
- map[x][y]=z;
- map[y][x]=z;
- }
- memset(way,,sizeof(way));
- scanf("%d",&s);
- way[s]=;
- for(i=;i<n;i++)
- {
- for(j=;j<=n;j++)
- if(way[j]<mi&&vis[j]==)
- {
- mi=way[j];
- w=j;
- }
- vis[w]=;
- for(j=;j<=n;j++)
- if(map[w][j]!=&&vis[j]==&&way[j]>way[w]+map[w][j])
- way[j]=way[w]+map[w][j];
- }
- for(i=;i<=n;i++)
- printf("%d ",way[i]);
- return ;
- }
那现在让我们分析一下复杂度,很明显高达O(N*N),那当做一些题时不论内存还是时间都会爆,那就急需我们做一些优化了
Dijkstra的堆优化:
依旧是迪杰斯特拉算法的思想,寻找当前距离最小的点,然后将它标记为已经确定的点,用它来更新各个没被确定的点。
emmmm我们选择优先队列来确定每一个最小距离的点
例题:【模板】单源最短路径
代码如下:
- #include<bits/stdc++.h>
- using namespace std;
- struct SYM{
- int to,next,w;
- }edge[];
- struct LKJ{
- int v,c;
- bool operator <(const LKJ &a)const {
- return c>a.c;
- }
- };
- priority_queue<LKJ,vector<LKJ> > q;
- int head[],vis[],tot,dis[],n,m,k;
- void add(int x,int y,int w){
- edge[++tot].to=y;
- edge[tot].w=w;
- edge[tot].next=head[x];
- head[x]=tot;
- }
- void dij(int s){
- dis[s]=;
- LKJ hh;hh.v=s;hh.c=;
- q.push(hh);
- while(!q.empty()){
- LKJ tmp=q.top();q.pop();
- int x=tmp.v;
- if(vis[x]) continue;vis[x]=;
- for(int i=head[x];i;i=edge[i].next)
- if(!vis[edge[i].to]&&dis[edge[i].to]>dis[x]+edge[i].w){
- dis[edge[i].to]=dis[x]+edge[i].w;
- hh.v=edge[i].to;hh.c=dis[edge[i].to];
- q.push(hh);
- }
- }
- }
- int main(){
- memset(dis,,sizeof(dis));
- int x,y,w;
- scanf("%d%d%d",&n,&m,&k);
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&x,&y,&w);
- add(x,y,w);
- }
- dij(k);
- for(int i=;i<=n;i++){
- if(dis[i]==) printf("2147483647 ");
- else printf("%d ",dis[i]);
- }
- return ;
- }
迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少的更多相关文章
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 迪杰斯特拉算法dijkstra(可打印最短路径)
#include <iostream> #include <iomanip> #include <string> using namespace std; #def ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- 图论——迪杰斯特拉算法(Dijkstra)实现,leetcode
迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离 两种实现方法: 邻接矩阵,时间复杂度O(n^2) 邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图) (n:图的节点数,m:图 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
随机推荐
- cockroachdb docker-compose 本地集群运行以及prometheus监控
cockroachdb 官方提供的是一个直接使用docker 运行的方式,但是使用docker-compose 会比较方便,可以快速搭建一个集群 同时官方也提供了prometheus 的metrics ...
- PHP7新增的主要特性
1.use的用法 <?php // PHP 7 之前版本用法 use some\namespace\ClassA; use some\namespace\ClassB; use some\nam ...
- NodeJS基础学习总结
一.nodeJS解释 JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是 ...
- 洛谷 P5614题解
吐槽:数据好像有点水,直接枚举到200可以得80 points. 另:我还是太弱了,比赛的时候只有90 points,#7死卡不过去,最后发现是没有判断 \(z_1\) 和 \(z_2\) 的范围-- ...
- 第09组 Alpha冲刺(1/6)
队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 与服务器连接,配合前 ...
- git 初始用法
Git global setup git config --global user.name "xiaoming" git config --global user.email & ...
- HDU 6212 Zuma
Zuma 这个题没有素质!它卡常! 我发现网上很多人的题解都写得很奇怪,也不好确定正确性,所以我借这篇题解表达一下愚见 定义$ dp[i][j][0...4]$表示 0:消完了 1:还剩1个0 2:还 ...
- 记一次cpu指标异常的跟踪排查
问题描述: 最近在测试环境的服务器上,无意中发现cpu持续飙高.最高的时候达到了200%经过反复重启无效之后,决定挖掘深层次的原因 通过top命令打印出消耗cpu的pid,如图 通过ps -mp 24 ...
- prometheus(docker)安装和报警 -- nginx域名监控
软件组件:prometheusalertmanagerprometheus-webhook-dingtalk nginx-vts-exporternginx (###--add-module=../n ...
- mpvue中按需引入echarts
大家都知道小程序文件大小不能超过2M, 在项目中引入echarts后,文件大小远远超出2M了.因为echarts文件默认是包含所有图表代码的,所以文件体积会比较大.解决办法如下: 安装 首先我们先安装 ...