#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<deque>
#include<cstring>
using namespace std;
struct H{
int cost;//边长
int to; //指向的店
};
vector<H>w[10001];//动态数组
int dis[100001],f[100001],d[100001];
int main()
{
int m,n,i,j,s;
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=m;i++)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
H e1;
e1.to=y;
e1.cost=k;
w[x].push_back(e1);
}
for(i=1;i<=n;i++)
dis[i]=2147483647;//最大值
f[s]=1;dis[s]=0;d[1]=s;
int h=0,t=1;
do
{
h++;
int x=d[h];
f[x]=0;
for(i=0;i<w[x].size();i++)//枚举与队首相连接的点,动态数组是在0开始存的
{
int p=w[x][i].to;
if(dis[p]>dis[x]+w[x][i].cost)
{
dis[p]=dis[x]+w[x][i].cost;
if(f[p]==0) d[++t]=p,f[p]=1;//如果此点有更新价值,就入队;
}
}
}while(h<t);
for(i = 1;i <= n;i++)
printf("%d ",dis[i]);
return 0;
}
错误
DI 1:我刚开始将所有的与队首相连的点都入队,导致了re也就是队爆了,其实只有这个点的最短路径值更新了,才有入队的价值;
DI 2:题目中说如果s与一个点不相连,就输出最大值,并且给出了最大值为214748364,也就是赋的初值,我却没有看到这句话,赋的初值为999999999。
mdzz我又犯了老毛病,不看题,不思考。