【模板】单源最短路径(弱化版)
题目链接:【模板】单源最短路径(弱化版)
题目背景
本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。
题目描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入格式
第一行包含三个整数 n,m,sn,m,sn,m,s,分别表示点的个数、有向边的个数、出发点的编号。
接下来 mmm 行每行包含三个整数 u,v,wu,v,wu,v,w,表示一条u→v的,长度为w的边。
输出格式
输出一行 nnn 个整数,第 iii 个表示 sss 到第 iii 个点的最短路径,若不能到达则输出 231−12^{31}-1231−1。
输入输出样例
输入
4 6 1
1 2 2
2 3 2
2 4 1
1 3 5
3 4 3
1 4 4
输出
0 2 4 3
解题思路
金典SPAF
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,p,c,a[81000],b[810000][5];
long long ans[81000],m,d[81000];
long long tot,head[100000];
long long f[10000100],maxn;
void add(int x,int y,int k)
{
tot++;
b[tot][1]=x;
b[tot][2]=y;
b[tot][3]=k;
b[tot][4]=head[x];
head[x]=tot;
}
int main()
{
cin>>maxn>>c>>n;
for(int i=1;i<=c;i++)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
add(x,y,k);
}
for(int i=1;i<=maxn;i++){
ans[i]=2147483647;
}
memset(d,0,sizeof(d));
int hd=0,tl=1;
f[1]=n;
d[n]=1;
ans[n]=0;
while(hd<=tl)
{
hd++;
int x1=f[hd];
for(int j=head[x1];j;j=b[j][4])
if(ans[b[j][2]]>ans[x1]+b[j][3])
{
ans[b[j][2]]=ans[x1]+b[j][3];
if(d[b[j][2]]==0)
{
tl++;
d[x1]=1;
f[tl]=b[j][2];
}
}
d[x1]=0;
}
for(int j=1;j<=maxn;j++)
cout<<ans[j]<<" ";
}
该博客介绍了弱化版单源最短路径问题,提供了题目背景、描述、输入输出格式及样例,并详细解析了解题思路,主要聚焦于SPFA算法的应用。
2545

被折叠的 条评论
为什么被折叠?



