题目描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
分析
spfa直接求啊,挺水的,而且有向图的预处理比无向图简单不少
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,s,i;
long long d[500001],u[500001],v[500001],w[500001],next[500001],list[500001],state[500001];
bool b[500001];
void spfa()
{
int head=0,tail=1,i;
state[1]=s;
b[s]=1;
for (i=1;i<=n;i++)
if (i!=s) d[i]=2147483647;
do
{
head++;
i=list[state[head]];
while (i>0)
{
if (d[u[i]]+w[i]<d[v[i]])
{
d[v[i]]=d[u[i]]+w[i];
if (!b[v[i]])
{
b[v[i]]=1;
tail++;
state[tail]=v[i];
}
}
i=next[i];
}
b[state[head]]=0;
}
while (head!=tail);
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i]=list[u[i]];
list[u[i]]=i;
}
spfa();
for (i=1;i<=n;i++)
if (i!=s)
{
if (d[i]!=2147483647)
printf("%lld ",d[i]);
else
printf("%d ",2147483647);
}
else
printf("0 ");
}