【模板】单源最短路径(标准版)
题目背景
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;
}
标签:10,int,样例,单源,leq,dis,模板,P3371
From: https://www.cnblogs.com/yufan1102/p/17853510.html