# 【模板】单源最短路径(标准版)

## 题目背景

2018 年 7 月 19 日,某位同学在 [NOI Day 1 T1 归程](https://www.luogu.org/problemnew/show/P4768) 一题里非常熟练地使用了一个广为人知的算法求最短路。

然后呢?

$100 \rightarrow 60$;

$\text{Ag} \rightarrow \text{Cu}$;

最终,他因此没能与理想的大学达成契约。

小 F 衷心祝愿大家不再重蹈覆辙。

## 题目描述

给定一个 $n$ 个点,$m$ 条有向边的带非负权图,请你计算从 $s$ 出发,到每个点的距离。

数据保证你能从 $s$ 出发到任意点。

## 输入格式

第一行为三个正整数 $n, m, s$。
第二行起 $m$ 行,每行三个非负整数 $u_i, v_i, w_i$,表示从 $u_i$ 到 $v_i$ 有一条权值为 $w_i$ 的有向边。

## 输出格式

输出一行 $n$ 个空格分隔的非负整数,表示 $s$ 到每个点的距离。

## 样例 #1

### 样例输入 #1

```
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
```

### 样例输出 #1

```
0 2 4 3
```

## 提示

样例解释请参考 [数据随机的模板题](https://www.luogu.org/problemnew/show/P3371)。

$1 \leq n \leq 10^5$;

$1 \leq m \leq 2\times 10^5$;

$s = 1$;

$1 \leq u_i, v_i\leq n$;

$0 \leq w_i \leq 10 ^ 9$,

$0 \leq \sum w_i \leq 10 ^ 9$。

本题数据可能会持续更新,但不会重测,望周知。

2018.09.04 数据更新 from @zzq

1.这个问题用dijkstra算法即可,要使用堆优化的dijkstra算法,否则会时间超限。

2.刚开始我是想自己手写一个堆,模拟优先队列,然而修修改改还是只是AC了俩个点 ,没办法去学了C++里面的STL里的优先队列。

3.继而就简单多了(代码少了将近一大半)

4.堆优化的dijkstra算法也是非常简单,核心思想是一样的,先松弛,再找最近的那一个点,继续松弛循环下去。用堆来实现就是把新更新的距离权值入队,然后在优先队列里面会自动在首元素是最小值了。我们只需要判断堆顶元素是否访问过即可,如果访问过了,就弹出堆顶元素,继续找就可以。

    while( !q.empty() )//如果队列不为空,就需要继续访问{tmp = q.top();//访问堆顶元素q.pop();//弹出队头x = tmp.pos, w = tmp.w;if( book[x] )continue;//如果该点已经纳入最短路径,需要跳过book[x] = 1;//从该点开始松弛for(i = head[x]; i; i = e[i].next )//链式前向星{y = e[i].to;if( dis[y] > dis[x] + e[i].w ){dis[y] = dis[x] + e[i].w;if( !book[y] ){q.push( ( node ){dis[y], y} );//插入元素并且重新排序}}}}

完整C++代码如下:

#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>
#include<algorithm>using namespace std;const int N = 100010, M = 500010;
const int INF=1000000000;
struct edges
{int to;int w;int next;
}e[M];
int head[N], dis[N];
bool book[N];
int n, m, s;
struct node
{int w;int pos;bool operator <( const node &x )const{return x.w <w;}
};
priority_queue<node> q;//建立堆
void dijk()
{int i,y,x,w;node tmp;dis[s] = 0;q.push( ( node ){0, s} );//放入该节点,也就是入队while( !q.empty() )//如果队列不为空,就需要继续访问{tmp = q.top();//访问堆顶元素q.pop();//弹出队头x = tmp.pos, w = tmp.w;if( book[x] )continue;//如果该点已经纳入最短路径,需要跳过book[x] = 1;//从该点开始松弛for(i = head[x]; i; i = e[i].next )//链式前向星{y = e[i].to;if( dis[y] > dis[x] + e[i].w ){dis[y] = dis[x] + e[i].w;if( !book[y] ){q.push( ( node ){dis[y], y} );//插入元素并且重新排序}}}}for( i = 1; i <= n; i++ )printf( "%d ", dis[i] );
}
int main()
{int i,u,v,w;scanf( "%d%d%d", &n, &m, &s );for(i = 1; i <= n; i++) dis[i] =INF;for(i = 1; i <= m; i++){scanf( "%d%d%d", &u, &v, &w );e[i].to=v;e[i].w=w;e[i].next=head[u];head[u]=i;}dijk();return 0;
}

P4779 【模板】单源最短路径(标准版)相关推荐

  1. p4779 单源最短路径(标准版)-java版

    传送门: P4779 [模板]单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4779 先给 ...

  2. p3371 单源最短路径(弱化版)-java题解-最短路

    弱化版传送门: P3371 [模板]单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通 ...

  3. 最短路——【模板】单源最短路径(弱化版)(dijkstra)

    题目链接 最短路--[模板]单源最短路径(弱化版)(dijkstra) 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入格式 第一行包含三个整数 n,m,s,分别表示点 ...

  4. P3371 【模板】单源最短路径(弱化版)

    题目 P3371 [模板]单源最短路径(弱化版) 分析 Dijkstra模板题,只不过这里用了链式前向星 AC代码 #include<cstdio> #include<iostrea ...

  5. 洛谷 P3371 【模板】单源最短路径(弱化版)【最短路】【spfa】

    洛谷 P3371 [模板]单源最短路径(弱化版) 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 洛谷 P3371 [模板]单源最短路径(弱化版) ...

  6. 洛谷_P3371 【模板】单源最短路径(弱化版)_dijkstra_堆优化

    洛谷_P3371 [模板]单源最短路径(弱化版)_dijkstra_堆优化 // dijkstra最短路算法_堆优化 #include<bits/stdc++.h> using names ...

  7. Luogu 3371【模板】单源最短路径

    Luogu 3371[模板]单源最短路径 第一次写博客用图论题来试一试 接下来是正文部分 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包 ...

  8. 55、【图】Dijkstra求最短路径(单源最短路径+边权重为正数)(C/C++版)

    算法介绍 Dijkstra算法是基于贪心思想,用于实现只含有正权边的单源最短路径问题,单源路径是从一个固定起始点出发到其余各点的路径. 算法过程: 首先,获取起始点到其余点的距离,然后从起始点出发,每 ...

  9. Dijkstra算法求解单源最短路径问题

    文章目录 一 前言 二 Dijkstra 算法讲解 1. 贪心算法的证明 2. 算法实现说明 3. 初版Dijkstra算法代码 三 时间复杂度优化 1. 优化策略 2. 优化后的代码 四 结语 一 ...

最新文章

  1. 第四组视频:在bash脚本中使用脚本选项
  2. 为什么要加上拉电阻和下拉电阻
  3. Lua:给Redis用户的入门指导
  4. Python中的第三方模块(微信为例)
  5. 伪验证码(含随机验证码方法)js+css
  6. unity怪物攻击玩家减血_Unity RPG游戏攻击的判定
  7. 5.4Irvine32库
  8. 在 Lotus Domino 7 应用程序中利用 IBM DB2 集成特性
  9. 基于SpringBoot超市库存管理系统+文档
  10. 计算机主板自动重启,电脑自动重启频繁是主板的问题吗
  11. 并发编程之CompletableFuture全网最细最全用法(一)
  12. 方阵的特征值与特征向量
  13. 科学计算机怎么调颜色,Win7旗舰版如何进行屏幕颜色校准
  14. getline()与cin.getline()函数用法详解
  15. Ubuntu下UnixC的第二天
  16. 重复制造里的HU 管理
  17. loadrunner之virtual user generator的使用
  18. 自己封装了一个带有比较日期的datepicker组件
  19. #XDOJ 172 构造表达式
  20. ICEM CFD结构化网格画边界层的方法

热门文章

  1. ACM--steps--dyx--2.3.7--下沙的沙子有几粒?
  2. Linux小小白入门教程(二):Linux系统安装
  3. tensorflow编程: Math
  4. 【编程实践】每日JK打卡程序操作说明
  5. 亚马逊跟卖什么意思?跟卖时这些问题要注意
  6. 滴滴数据通道服务演进之路
  7. 化工行业的ERP选型
  8. python输出到控制台和文件_python 信息同时输出到控制台与文件的实例讲解
  9. 缺陷管理:不予修复和设计如此的区别:
  10. GoldenDict万能词典