P3371 【模板】单源最短路径

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

题目背景

2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。

然后呢?

\(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

提示

样例解释请参考 数据随机的模板题

\(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\)

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

#define int long long
using namespace std;
const int N=1e4+10;
const int inf=2147483647;
vector<pair<int,int>>a[N];
int dis[N],vis[N];
int n,m,s;
void BFS(){
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
	dis[s]=0;
	q.push({0,s});
	while(q.size()){
		auto u=q.top();
		int d=u.first;
		int v=u.second;
		q.pop();
		if(vis[v])continue;
		for(auto c:a[v]){
			if(dis[v]+c.second<dis[c.first]){
				dis[c.first]=dis[v]+c.second;
				q.push({dis[c.first],c.first});
			}
		}
		vis[v]=1;
	}
}
signed main(){
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++){
		dis[i]=inf;
	}
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		a[u].push_back({v,w});
	}
	BFS();
	for(int i=1;i<=n;i++){
		cout<<dis[i]<<" ";
	}
	return 0;
}
posted @ 2023-11-24 12:50  yufan1102  阅读(77)  评论(0)    收藏  举报