图论单源最短路径——spfa

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

本题用的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 u→v 的,长度为 w w w 的边。

输出格式

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

样例 #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 1≤n≤5, 1 ≤ m ≤ 15 1\le m \le 15 1≤m≤15;

对于 40 % 40\% 40% 的数据: 1 ≤ n ≤ 100 1\le n \le 100 1≤n≤100, 1 ≤ m ≤ 1 0 4 1\le m \le 10^4 1≤m≤104;

对于 70 % 70\% 70% 的数据: 1 ≤ n ≤ 1000 1\le n \le 1000 1≤n≤1000, 1 ≤ m ≤ 1 0 5 1\le m \le 10^5 1≤m≤105;

对于 100 % 100\% 100% 的数据: 1 ≤ n ≤ 1 0 4 1 \le n \le 10^4 1≤n≤104, 1 ≤ m ≤ 5 × 1 0 5 1\le m \le 5\times 10^5 1≤m≤5×105, 1 ≤ u , v ≤ n 1\le u,v\le n 1≤u,v≤n, w ≥ 0 w\ge 0 w≥0, ∑ w < 2 31 \sum w< 2^{31} ∑w<231,保证数据随机。

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

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

样例说明:

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

代码:

c++ 复制代码
/*
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-1
		else cout<<d[i]<<" ";	
	}
}
相关推荐
迷迭所归处几秒前
动态规划 —— 子数组系列-单词拆分
算法·动态规划
爱吃烤鸡翅的酸菜鱼几秒前
Java算法OJ(8)随机选择算法
java·数据结构·算法·排序算法
寻找码源43 分钟前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
Matlab精灵44 分钟前
Matlab科研绘图:自定义内置多款配色函数
算法·matlab
诚丞成1 小时前
滑动窗口篇——如行云流水般的高效解法与智能之道(1)
算法
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔2 小时前
《线性代数的本质》
线性代数·算法·决策树
yigan_Eins3 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶3 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
დ旧言~3 小时前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法