dijkstra算法 是一种单源点最短路算法求出一个点到其他所有点的最短路。

给你这样的一个图,需要求出1号点到其他点的最短距离是多少。

首先我们开一个数组 d[N],d[x] 代表着从起点出发到x点的距离是多少。

开一个数组vis[N], vis[x]数组代表着某个点d[x]是不是成为定值,不会再变小了。

然后我们在开一个数组,edge[N][N],edge[a][b] 代表着从a点走到b的路程是多少。

如果不存在 a->b的这条边,那么就将他设置为-1。

更新d数组的条件:d[a] > d[b] + edge[b][a] 的时候更新d[a]的值。

一开始我们将所有距离设置都设置 inf ( inf 意为无穷大)。

当然d[s] = 0;

所以对于刚开始的数组d[]来说他的值应该为

图的状态应该是

现在我们从1号点出发,图上存在一个 1->3的边 距离为 10  存在一个1->2的边 距离为20。

那么d[3] =  min(d[3], d[1] + edge[1][3]) d[2] = min(d[2], d[1] + edge[1][2])

d数组即被更新成

其中vis[1] = 1,即这个点不会的距离不会在变小了。

我们扫一遍d数组,跳过vis[x] == 1的点,找到d[x]最小的点,通过上面的那个数组我们可以发现,这个点是3,

我们把 vis[3] = 1, 然后再通过3号点出发更新d[].

   d数组的值为

然后我们继续找到d[x]最小的且没被标记过的点  由上表可知是点2

我们标记点2,然后再用2号点出发,看看有没有点的距离可以被更新成更小的。

当我们走完2号点的边的时候,图就会变成

d数组的结果为

我们继续找到d[x]最小的且没被标记过的点  由上表可知是点4

我们先标记4号点,然后通过点4出发,然后看一下出4号点出发,有没有点的d会被更新成更小的值

d数组的结果为

最后没标记过的点只有5了, 我们从5号点出发,看看有没有点会继续被更新。

我们得到最后的图就变成了

d数组最后就被更新成了

这样我们就进行完了dijkstra算法。

从原点出发到各个点的最短路径是多少就求出来了。

假设 d[a] < d[b] , 并且存在edge[a][b] , 那么因为边edge[a][b] > 0,那么不可能通过 b 点去更新 a 点, 只可能从a点出发然后到b点,使得d[b]的更小。

因为更新的条件是  d[b] > d[a] + edge[a][b]。 所以只有从d[]更小的点出发才有可能使得别的点更小。

总结下来的话,就是从原点出发,每次都选出当前距离里原点最近的点(跳过标记过的点)x,然后从x点出发,遍历x点的所有边,看一下是不是存在别的点可以通过点x往外走,使得原点到目标点的距离更小,并且标记一下点x,下次不会再选择x,因为x已经是最小的了。

每次都确立一个点,确立完一个点后需要其访问所有点去更新距离,总有由n个点

所以 时间复杂度是 n * 2n

来一个题目:

HDU 2544

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int edge[+][+];
int d[+];
bool vis[+];
const int inf = 0x3f3f3f3f;
int main()
{
int n, m;
while(~scanf("%d%d",&n,&m)&& (n || m)){
int a,b,c;
memset(edge, -, sizeof(edge));
memset(d, inf, sizeof(d));
memset(vis, , sizeof(vis));
while (m--){
scanf("%d%d%d", &a, &b, &c);
edge[a][b] = edge[b][a] = c;
}
for(int i = ;i <= n;i++ ){
if(edge[][i] == -) continue;
d[i] = edge[][i];
}
d[] = ;
vis[] = ;
while (){
int min1 = inf,z = -;
for (int j = ;j <= n; j++)
if(!vis[j] && min1 > d[j])
z = j, min1 = d[j];
if(z == -) break;
vis[z] = ;
for (int j = ; j <= n ; j++){
if(edge[z][j] == -) continue;
d[j] = min(d[j], d[z] + edge[z][j]);
}
}
printf("%d\n", d[n]);
}
return ;
}

现在这个是时空复杂度最高的代码。

接来下还有关于dijkstra优化的传送门

最短路算法 Dijkstra 入门的更多相关文章

  1. (转)最短路算法--Dijkstra算法

    转自:http://blog.51cto.com/ahalei/1387799         上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...

  2. 10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

  3. 最短路算法 —— Dijkstra算法

    用途: 解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题) 算法核心(广搜): (1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离. (2) ...

  4. 图的最短路算法 Dijkstra及其优化

    单源最短路径算法 时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快) 不支持有负权的图 #include<iostream> usin ...

  5. Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)

    上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...

  6. Dijkstra最短路算法

    Dijkstra最短路算法 --转自啊哈磊[坐在马桶上看算法]算法7:Dijkstra最短路算法 上节我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最 ...

  7. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

  8. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  9. [LeetCode] Network Delay Time 网络延迟时间——最短路算法 Bellman-Ford(DP) 和 dijkstra(本质上就是BFS的迭代变种)

    There are N network nodes, labelled 1 to N. Given times, a list of travel times as directed edges ti ...

随机推荐

  1. asp.net core 一个中小型项目实战的起手式——项目搭建与仓储模式下的持久层创建(1)

    常规的中小型项目搭建方式一般是三层架构加上mvc与webapi作为一个主要框架,再加上一些第三方库,例如orm框架(EF.SqlSugar.Dapper等),API文档工具(Swagger)这些的应用 ...

  2. 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法

    面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...

  3. vim 基础配置

    最近在使用 python 搞服务, 简单配置了一个 vim, 配置了自动补全以及背景色 .(ps:搜狗输入法快捷键占用真是太坑爹,改用谷歌输入法,世界安静了) 具体配置如下: 一. 安装插件 1.克隆 ...

  4. ASP.NET Core on K8S深入学习(5)Rolling Update

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.什么是Rolling Update? 为了服务升级过程中提供可持续的不中断 ...

  5. Spring Cloud与Dubbo的完美融合之手「Spring Cloud Alibaba」

    很早以前,在刚开始搞Spring Cloud基础教程的时候,写过这样一篇文章:<微服务架构的基础框架选择:Spring Cloud还是Dubbo?>,可能不少读者也都看过.之后也就一直有关 ...

  6. cmd命令行界面运行python脚本显示的中文不正确

    在notepad++中编写了一个脚本(如图一),在cmd命令行界面中运行却发现显示的中文不正确(如图2).图3显示的是cmd界面的默认编码. 解决方案:将脚本的注释语言改为GBK,编码格式改为ANSI ...

  7. MySQL隔离性及Spring事务

    一.数据库事务ACID特性 必须要掌握事务的4个特性,其中事务的隔离性之于MySQL,对应4级隔离级别. 原子性(Atomicity): 事务中的所有原子操作,要么都能成功完成,要么都不完成,不能停滞 ...

  8. Ng-Matero 0.1 发布了!

    Ng-Matero 0.1 终于发布了!周末折腾了两天,结果最后发版还是出了点意外,好在今天补了一版. 距离 Ng-Matero 发布第一版已经过去了一个多月,然后很颓废地休息了半个多月,最近项目的关 ...

  9. python学习之路(1)---编程语言,变量

    编程语言的类型分为三大类:1.机器语言:01010的二进制语言,执行速度快,开发效率低2.汇编语言:把0101转换成我们可以看懂的字母,执行速度快,开发效率低3.高级语言 : 编译型语言:把源代码编程 ...

  10. JDK1.6 对 synchronized 的锁优化

    1. 背景 在 JDK 1.6 中对锁的实现引入了大量的优化. 目的 减少锁操作的开销. 2. 锁优化 在看下面的内容之间,希望大家对 Mark Word 有个大体的理解.Java 中一个对象在堆中的 ...