图论单源最短路径——spfa

ops/2025/1/16 2:54:24/

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

本题用的spfa

题目背景

本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。

题目描述

如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

输入格式

第一行包含三个整数 n , m , s n,m,s n,m,s,分别表示点的个数、有向边的个数、出发点的编号。

接下来 m m m 行每行包含三个整数 u , v , w u,v,w u,v,w,表示一条 u → v u \to v uv 的,长度为 w w w 的边。

输出格式

输出一行 n n n 个整数,第 i i i 个表示 s s s 到第 i i i 个点的最短路径,若不能到达则输出 2 31 − 1 2^{31}-1 2311

样例 #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

提示

【数据范围】
对于 20 % 20\% 20% 的数据: 1 ≤ n ≤ 5 1\le n \le 5 1n5 1 ≤ m ≤ 15 1\le m \le 15 1m15
对于 40 % 40\% 40% 的数据: 1 ≤ n ≤ 100 1\le n \le 100 1n100 1 ≤ m ≤ 1 0 4 1\le m \le 10^4 1m104
对于 70 % 70\% 70% 的数据: 1 ≤ n ≤ 1000 1\le n \le 1000 1n1000 1 ≤ m ≤ 1 0 5 1\le m \le 10^5 1m105
对于 100 % 100\% 100% 的数据: 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1n104 1 ≤ m ≤ 5 × 1 0 5 1\le m \le 5\times 10^5 1m5×105 1 ≤ u , v ≤ n 1\le u,v\le n 1u,vn w ≥ 0 w\ge 0 w0 ∑ w < 2 31 \sum w< 2^{31} w<231,保证数据随机。

Update 2022/07/29:两个点之间可能有多条边,敬请注意。

对于真正 100 % 100\% 100% 的数据,请移步 P4779。请注意,该题与本题数据范围略有不同。

样例说明:

图片1到3和1到4的文字位置调换

代码:

/*
spfa 2024.4.28 SimonAN
*/
#include<iostream>
#include<bits/stdc++.h>
#define lyh(i,a,b) for(int i = a;i <= b;i ++)
#define hyl(i,a,b) for(int i = a;i >= b;i --)
#define debug(a) cout<<#a<<'='<<a<<endl;
#define endl "\n"
#define LL long long
#define INF 0x3f
using namespace std;
const int N = 5e5 + 100;
int n,m,s;
int h[N],e[N],ne[N],idx;
LL w[N];
int d[N];
void add(int a,int b,int c){e[idx] = b, w[idx] = c,ne[idx] = h[a], h[a] = idx ++;
}
int q[N];
int st[N];
int tt = -1,hh = 0;
void spfa(){d[s] = 0;q[++tt] = s, st[s] = 1;while(hh <= tt){int t = q[hh++];st[t] = 0;for(int k = h[t];k != -1;k = ne[k]){int ee = e[k];if(d[ee] > d[t] + w[k]){d[ee] = d[t] + w[k];if(st[ee] == 0){q[++tt] = ee; st[ee] = 1;}}}}
}
int main(){memset(d,0x3f3f3f,sizeof d);memset(h,-1,sizeof h);cin>>n>>m>>s;lyh(i,1,m){int a,b,c; cin>>a>>b>>c;add(a,b,c);}spfa();lyh(i,1,n){if(d[i] >= 0x3f3f3f) cout<<INT_MAX<<" ";//INT_MAX 是最大的int值也就是2^31-1else cout<<d[i]<<" ";	}
}

http://www.ppmy.cn/ops/25580.html

相关文章

sym和syms--Matlab学习

一、sym sym是 MATLAB 中的一个函数&#xff0c;用于创建符号对象。 符号对象允许你在 MATLAB 中进行符号计算和代数运算&#xff0c;而不仅仅是数值计算。使用符号对象&#xff0c;你可以表示符号表达式&#xff0c;求解方程&#xff0c;进行符号积分等。 例如&#xff0c;你…

【MySQL】表的约束

【MySQL】表的约束 文章目录 【MySQL】表的约束前言正文空属性默认值列描述zerofill主键自增长唯一键外键 前言 ​ 对于表来说&#xff0c;真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;我们需要有一些额外的约束&#xff0c;更好的保证数据的合法…

2012NOIP普及组真题 2. 寻宝

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1958 核心思想&#xff1a;&#xff08;模拟&#xff09; 1、模拟 每一层从起始房间开始&#xff0c;轮询 x 个有楼梯的房间后到达终点房间 2、由于 0 < N ≤ 10000 &#xff0c; 0…

VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt5.15.2时遇到的问题及解决方法

注:本次编译以文章《VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt》为基础搜集资料并进行编译 一 OSG编译 1.Osg3.7.0编译中,cmake阶段按照文章步骤即可。 2.另外,还需要对以下三项进行设置,参照《OSG-OpenSceneGraph在WIN10与VS2022下的部署(OSG3.6.5+VS2022+Win10_x64)个…

多服务器上的 docker 实现互相访问

场景&#xff1a; Server_1上有一个docker容器 containerXServer_2上有一个docker容器 containerX…Server_n上有一个docker容器 containerX 如何实现着 n 个docker之间的互相访问呢&#xff1f; 实现方式&#xff1a; Step1&#xff1a;配置一个通用的容器 新建一个容器&a…

OpenHarmony 实战开发——智能指针管理动态分配内存对象

概述 智能指针是行为类似指针的类&#xff0c;在模拟指针功能的同时提供增强特性&#xff0c;如针对具有动态分配内存对象的自动内存管理等。 自动内存管理主要是指对超出生命周期的对象正确并自动地释放其内存空间&#xff0c;以避免出现内存泄漏等相关内存问题。智能指针对…

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态

安卓手机APP开发_媒体开发部分__保持设备处于唤醒状态 目录 概述 使用唤醒锁的用法 保持屏幕在亮着 电视的环境模式 保持CPU处于运行状态 概述 为了避免多消耗电池电量,安卓设备会很快进入休眠状态.然而,也是需要保持它一直 处于唤醒的状态,来完成某些工作. 你使用的方…

面试的时间地点(南京坦道)工程化问题比较少,通用性问题表较多

1.前端的选型 2.前端的$nicktick&#xff08;&#xff09; 3.前端的媒体查询 4.前端的 VUE 高级用法 我的回答{ web端视图层的渲染原理 } 5.前端的数组&#xff0c;异步处理 我的回答{ 回了&#xff0c;最笨的方法。 es6的set&#xff08;&#xff09;&#xff1b; 参数是&…