Shortest Path Fastest Algorithm
首先定义一个数组dd,代表我们选定的起点到其他各个点的距离最小值,将dd数组中除了起点以外的所有的元素都赋成INF(无限大)。
然定义一个队列(先进先出),并将起点压入队列中,记录起点已经在队列中。
这之后,每次取出一个节点(设为u),枚举与之相连的节点(设为v,并设线段uv的长度为w),如果发现d[u]+w<d[v],那么就更新d[v]=d[u]+w,并且如果v不在队列中,就将其加入队列,并记录vv点已经在队列中。如果不满足d[u]+w<d[v],那么就什么也不做,继续取下一个v。
#include<iostream>
#include<queue>
using namespace std;
int n,m,s;
#define MM 500005
#define MN 10005
#define INF 99999999
struct node{int u,v,w,next;};
node edge[MM];
int head[MN];
int spfa[MN];
queue<int>q;
bool inq[MN];
void SPFA()
{
q.push(s);
inq[s]=true;
for(int i=1;i<=n;i++)
spfa[i]=INF;
spfa[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
inq[u]=false;
for(int i=head[u];i>0;i=edge[i].next)
{
int v=edge[i].v;
int w=edge[i].w;
if(spfa[v]>spfa[u]+w)
{
spfa[v]=spfa[u]+w;
if(!inq[v])
{
inq[v]=true;
q.push(v);
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
edge[i]=(node){u,v,w,head[u]};
head[u]=i;
}
SPFA();
for(int i=1;i<=n;i++)
{
if(spfa[i]==INF) spfa[i]=INF;
cout<<spfa[i]<<" ";
}
return 0;
}
优化:两种
来自某一位dalao。