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. firewalld防火墙命令规则设置

    1.firewalld的基本使用 启动/关闭: systemctl start/stop firewalld 查看状态: systemctl status firewalld 开机启用/禁用 : sy ...

  2. SpringBoot的yml配置

    Spring Boot的yml配置 #开发配置 spring: data: solr: host: http://localhost:6789/solr/mote mvc: view: # 页面默认前 ...

  3. 关于定时器Scheduled(cron)的问题

    定时器配置步骤参考:http://blog.csdn.NET/sd4000784/article/details/7745947 下面给出cron参数中各个参数的含义: CRON表达式    含义 & ...

  4. Where is the clone one and how to extract it?

    One cannot be in two places at once. Do you know what's "Dual Apps"? Manufactures like Xia ...

  5. Git应用之eclipse解决冲突代码

    最近上班公司框架换成了微服务下面是eclipse 对代码进行管理 1.冲突代码 如果两个人在一个项目上同一文件上更改代码就会出现冲突现象 先用NewFile.jsp  文件做演示 打开eclipse从 ...

  6. 监控LVS

    监控LVS #!/usr/bin/python-2.6.6 #data 2017-10-17 #auth liuchao import commands,os,time #-------------- ...

  7. kubernetes集群升级的正确姿势

    kubernetes社区非常活跃,每季度都会发布一个release.但是线上集群业务可用性要求较高,场景复杂,任何微小的变更都需要非常小心,此时跟随社区版本进行升级略显吃力.但是为了能够使用到最新的一 ...

  8. Docker系列之烹饪披萨(二)

    前言 上一篇我们讲解了虚拟机和容器的区别,本节我们来讲讲Docker中关于Dockerfile.镜像.容器等基本概念.Docker是一个在容器内开发.部署.运行应用程序的平台,Docker本质上是容器 ...

  9. [TCP/IP]DNS解析

    DNS解析主机的IP地址 host -t A www.baidu.com

  10. JVM运行时数据区--深入理解Java虚拟机 读后感

    程序计数器 程序计数器是线程私有的区域,很好理解嘛~,每个线程当然得有个计数器记录当前执行到那个指令.占用的内存空间小,可以把它看成是当前线程所执行的字节码的行号指示器.如果线程在执行Java方法,这 ...