Bellman-ford队列优化算法 SPFA算法

时间:2021-05-16 09:44:56

Bellman-ford队列优化算法的核心在于

:继承了bellman-ford算法的核心内容(邻接表处理)

    利用队列优化,减少了不必要的判断


下面在代码中进行详解

#include"iostream"
#include"cstdio"
#define inf 9999999
using namespace std;


int u[100];         //u,v,w为邻接表存储边信息的必要数组空间

int v[100];

int w[100];
int dis[100];         //记录源点到其余个点的最短路
int first[100];        //记录i为起点的第一个边的编号
int next[100];        //记录i号边的下一条边的编号
int n,m;
int book[100];        //判重是否点已经进入队列
int queue[100];      //队列
int head;
int tail;
int k;


int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)                   //dis初始化
{
dis[i]=inf;
}
dis[1]=0;
for(int i=1;i<=n;i++)                //first初始化
{
first[i]=-1;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);                  //边的录入
next[i]=first[u[i]];
first[u[i]]=i;
}
queue[1]=1;
head=1;
tail=2;
book[1]=1;
while(head<tail)
{
k=first[queue[head]];         
while(k!=-1)
{
if(dis[v[k]]>dis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
book[v[k]]=1;
queue[tail]=v[k];
tail++;
}
}
k=next[k];
}
head++;
book[queue[head]]=0;
}
for(int i=1;i<=n;i++)
{
printf("%d ",dis[i]);
}
return 0;
}