dijkstra呢是最短路三大算法之一。很多人都觉得不如spfa,但是这两者在跑稠密图时,dijkstra有奇效

在讲之前先说一说食用方法:

适用于有向的无负权值的图。

样例飘过

6 9 1      //n个点,m条边,以s为起点
1 3 3
1 6 10
3 6 5
4 3 7
1 4 4
4 2 5
5 2 4
4 5 6
3 5 6

  

0 9 3 4 9 8

  

上面这组样例我们让他更直观一些

神图警报,请开启护眼模式

真心累

首先我们应该知道dijkstra的核心思想是贪心。

定义一个$dis$数组,$dis[i]$表示从起点到i节点的距离,我们在程序一开始的时候把dis全部赋值成INF,

只把dis[s]赋值成0,(因为s->s == 0),这时候我们需要定义一个bool行的数组book,book[i]表示节点是否被访问过。

那么接下来就进入核心部分了。

我们每次从所有的节点中找一个dis值最小的,当让我们知道第一次肯定会找到s,然后以这个点为节点向外扩展,如果在已知的边的基础上可以找到更短的到某一个点的路径,那么就将这个路径更新。

这么说可能有点抽象,那么让我们看点实在的

上图

第一次找到了dis值最小的1号节点向外扩展,那么现在dis数组的值为

$dis[1] = 0, dis[2] = INF, dis[3] = 3, dis[4] = 4, dis[5] = INF, dis[6] = 10$

记得要把book[1]变成1,代表已经访问过。

接下来进行第二次扩展,这时候由于dis[1]我们已经访问过,所以接下来就会选择3号节点进行扩展

如图

从3号节点出去的边可以连到5和6,连5时毫无疑问会更新,但是再连6时,我们发现dis[6]已经扩展了一次,那么怎么办呢,很明显,从1走到3再走到6的话总路程为dis[3]加上3到6的路程,共为8,比现有的dis[6]要小,所以我们就要再更新dis[6] = 8;

通过这么一次次的更新,我们就能把这张图的最短路跑完,注意是单源最短路。

说了这么多我们来看下代码,但是我这个代码有个很玄学的地方,就是建边的时候我写的是用数组实现的邻接链表,但是原理是和结构体实现的邻接链表相同,大家将就着看,如果看不懂那就参考一下下面这篇文章

【坐在马桶上看算法】算法8:巧妙的邻接表(数组实现)

这里讲的非常的详细,我当初就是看的这里。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 500008
#define INF 2147483647
#define maxn 10008 using namespace std; int n, m, s;
int next[MAXN], first[MAXN];
int u[MAXN], v[MAXN], w[MAXN];
int dis[maxn];
bool book[MAXN]; int main() {
scanf("%d%d%d", &n, &m, &s);
for(int i=1; i<=n; i++) {
dis[i] = INF;
}
dis[s] = 0;
memset(first, -1, sizeof(first));
for(int i=1; i<=m; i++) {
scanf("%d%d%d", &u[i], &v[i], &w[i]);
next[i] = first[u[i]];
first[u[i]] = i;
}
for(int i=1; i<n; i++) {
int minn = INF, x;
for(int j=1; j<=n; j++) {
if(dis[j] < minn&&book[j] == 0) {
minn = dis[j];
x = j;
}
}
book[x] = 1;
int k = first[x];
while(k != -1) {
if(dis[v[k]] > dis[u[k]]+w[k]) {
dis[v[k]] = dis[u[k]]+w[k];
}
k = next[k];
}
}
for(int i=1; i<=n; i++) {
printf("%d ", dis[i]);
}
}

  

谈一谈Dijkstra的更多相关文章

  1. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  2. 谈一谈泛型(Generic)

    谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 ​ 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...

  3. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  4. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  5. 谈一谈iOS事件的产生和传递

    谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...

  6. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

  7. 谈一谈APP版本号问题

    如题:谈一谈APP版本号问题 为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单.我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧.我擦,我刚加的 ...

  8. 谈一谈深度学习之semantic Segmentation

    上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...

  9. 蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

    ***************************************声明*************************************** 个人在oracle路上的成长记录,当中 ...

  10. 谈一谈并查集QAQ(上)

    最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...

随机推荐

  1. 《iOS Human Interface Guidelines》——Wallet

    Wallet Wallet(钱包)帮助人们查看和管理Pass(凭证),这是一种相似于登机牌.优惠券.会员卡.奖励卡和各种票的物理凭证的数字替代.Wallet也同意人们加入信用卡.借记卡和储值卡来和Ap ...

  2. 我所不知的 javascript Object 的一些现象

    1.我们都知道对象访问属性有两种方法,一种是使用 . 操作符,使用它添加的属性名必须满足标识符的命名规范:另一种是使用 [] 键访问的方法,可以接受任意UTF-8/Unicode字符串作为属性名,在E ...

  3. Linux下查看history里的某种命令

    Linux下,直接键入history命令,会将当前账户此前所有的命令都显示出来,未免太多了些.如果我只想查找某种命令,怎么办? 比如说,我只想查找我之前运行过的 "git" 命令 ...

  4. sed 之 模式空间 & 保持空间

    模式空间:容纳当前输入行的缓冲区: 保持空间:作为辅助的一个缓冲区,可以和模式空间进行交互,但是命令不能直接作用于保持空间. 由上面定义可以知道,模式空间和保持空间是两个独立的缓冲区,可以进行交互,命 ...

  5. [python基础] celery beat/task/flower解析

    一.Celery 介绍 Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务( async task )和定时任务( ...

  6. 66.extjs 里对getvalue() 和getRawValue()

    转自:https://blog.csdn.net/u014236541/article/details/49663589?locationNum=8

  7. PCB 规则引擎之脚本语言JavaScript应用评测

    世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...

  8. Mac 终端执行JavaScript

    创建: 2017/09/16    第一步   打开命令  输入alias jsc="/System/Library/Frameworks/JavaScriptCore.framework/ ...

  9. codevs3728联合权值(LCA)

    3728 联合权值  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 输入描述 Input Des ...

  10. [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...