说实在的,这算法很简单,很简单,很简单……因为它是贪心的,而且码量也小,常数比起SPFA也小。

主要思想

先初始化,dis[起点]=0,其它皆为无限大。

还要有一个bz数组,bz[i]表示i是否确定为最短路径

for i=1 to n
{
在未确定最短路径的点中找出u使dis[u]最小
bz[u]=1;
更新与u相连的所有点
}

就这么简单。

实现讲解

其实也很好实现。可以用邻接表储存,也可以用邻接矩阵储存,虽然会慢一点。因为Dijkstra算法本就是对付稠密图的,不过我还是建议用邻接表,见SPFA实现讲解

注意事项

Dijkstra不能处理负边权的状况,所以要看清题目大意才用它哦!

具体代码

#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <limits.h>
using namespace std;
struct _Way//定义_Way类型,表示某点到点y的距离为len
{
int y,len;
};
int n,m;
int q;
_Way way[1001][1001] {};//way[i][j]表示从i开始的第j条路
_Way* bz[1001][1001] {};//读入时标记,防止重边出现。bz[i][j]指向从i到j的直接路径
int now[1001] {};//now[i]表示从i开始的边的数量
int dis[1001] {};//dis[i]表示从起点到i的最短路径
int min(int a,int b){return a<b?a:b;}
void Dijkstra(int);
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,len;
cin>>x>>y>>len;
if (bz[x][y]!=NULL)//若重边则替换之
{
bz[x][y]->len=min(bz[x][y]->len,len);
continue;
}
now[x]++;
way[x][now[x]].y=y;
way[x][now[x]].len=len;
bz[x][y]=&(way[x][now[x]]);//标记好地址
}
cin>>q;
Dijkstra(q);
for(int i=1;i<=n;i++)
{ if (dis[i]!=INT_MAX)
cout<<dis[i]<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
void Dijkstra(int q)//注意Dijkstra算法不能有负边权
{
bool bz[1001] {};//bz[i]表示点i是否已标记成最短路径
for(int i=0;i<=n;i++)
dis[i]=INT_MAX;
dis[q]=0;//初始化
for(int i=1;i<=n;i++)
{
int u {};
for(int j=1;j<=n;j++)
if ((!bz[j])&&(dis[j]<dis[u]))
u=j;//u为未确定点中dis最小的点
if (u==0) break;
bz[u]=1;//标记为确定点
for(int i=1;i<=now[u];i++)
dis[way[u][i].y]=min(dis[way[u][i].y],dis[u]+way[u][i].len);//更新与其相连的所有点
}
}

优化

用堆优化,暂时不会。

SPFA和Dijkstra哪个强?

SPFA擅长于稀疏图,而Dijkstra擅长于稠密图

SPFA可以处理负边权,Dijkstra不可以处理负边权

SPFA时间复杂度为O(kE),Dijkstra时间复杂度为O(n^2)

SPFA的空间要比Dijkstra多一个队列

SPFA的优化有SLF和LLL,Dijkstra的优化有堆优化

SPFA和Dijkstra均不可以处理负权回路

SPFA的时间系数要比Dijkstra大(Floyed和Ford笑了)

SPFA和Dijkstra都是单源的(Floyed又笑了)

没有边的图 O(1)特殊判断 SPFA秒过,完全图Dijkstra秒过(Floyed和Ford骄傲地说:“我们的时间是固定的!”)

图论最短路径算法——Dijkstra的更多相关文章

  1. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  2. 有向有权图的最短路径算法--Dijkstra算法

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

  3. 最短路径算法Dijkstra和A*

    在设计基于地图的游戏,特别是isometric斜45度视角游戏时,几乎必须要用到最短路径算法.Dijkstra算法是寻找当前最优路径(距离原点最近),如果遇到更短的路径,则修改路径(边松弛). Ast ...

  4. 图论最短路径算法总结(Bellman-Ford + SPFA + DAGSP + Dijkstra + Floyd-Warshall)

    这里感谢百度文库,百度百科,维基百科,还有算法导论的作者以及他的小伙伴们...... 最短路是现实生活中很常见的一个问题,之前练习了很多BFS的题目,BFS可以暴力解决很多最短路的问题,但是他有一定的 ...

  5. 图论-最短路径 2.Dijkstra算法O (N2)

    2.Dijkstra算法O (N2) 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法.也就是说,只能计算起点只有一个的情况. Dijkstra的时间复杂度是O (N2),它不能处 ...

  6. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  7. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

    根据DSqiu的blog整理出来 :http://dsqiu.iteye.com/blog/1689163 PS:模板是自己写的,如有错误欢迎指出~ 本文内容框架: §1 Dijkstra算法 §2 ...

  8. 最短路径算法——Dijkstra算法

    在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...

  9. 最短路径算法——Dijkstra算法与Floyd算法

    转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2  ...

随机推荐

  1. mysql开启操作日志(包含所有操作)

    配置 方法一:设置配置文件my.cnf(需重启) 添加以下参数 [mysqld] log_output=FILE # 日志打印到文件,默认配置,可以配置成table,日志就会记录到mysql库中的相应 ...

  2. 2、http请求与http响应

    我们在接口测试过程中,可能会用http协议,webservice协议,当然用的较多的还是http协议,webservice协议在此不做过多介绍,我们先了解一下http协议,然后重点介绍http请求与响 ...

  3. 如何使用Hive集成Solr?

    (一)Hive+Solr简介 Hive作为Hadoop生态系统里面离线的数据仓库,可以非常方便的使用SQL的方式来离线分析海量的历史数据,并根据分析的结果,来干一些其他的事情,如报表统计查询等. So ...

  4. c++11 Thread库写多线程程序

    一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...

  5. COGS2353 【HZOI2015】有标号的DAG计数 I

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 10007的结果 输入格式 一个正整数n 输出格式 一个数,表示答案 样例输入 3 样例输出 25 提 ...

  6. MySQL安装pdf介绍

    pdf地址:https://files.cnblogs.com/files/pygo/mysql%E5%AE%89%E8%A3%85.pdf

  7. 剑指Offer-13:调整数组位置使奇数位于偶数前面

    题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变.例如给定一个数组 ...

  8. Maven远程仓库地址修改(精)

    国内最快的maven镜像  阿里云maven镜像 <repositories> <repository> <id>spring-snapshots</id&g ...

  9. 巧用android:divider属性设置LinearLayout中元素之间的间隔

    如上图,要想实现3个button线性排列并且使它们的大小相同.间隔相等.而且整体填充满整个linearlayout,我们一般的做法是在每两个button之间放一个固定宽度的view,然后设置butto ...

  10. (转)[视频压制/转换技术] I帧 B帧 P帧 IDR帧 等帧用途详细说明

    转:http://www.u2game.net/bbs/thread-46116-1-1.html 在视频压制.转换中,经常会看到:I帧 B帧 P帧 IDR帧 等名词,这里就是通用的解释一下这些帧的用 ...