SPFA算法是对bellman-fort算法的进一步优化,更大程度的减小时间复杂度;
具体看代码
#include<stdio.h>
#include<queue>
#include<iostream>
#define info 99999
#define maxn 100
using namespace std;
int dis[maxn];
int v,e;//点,边
queue<int> q;
int flag[maxn];//表示所有的点都不在队列中
int times[maxn];//表示每一个点的入队次数
//边集
struct graph
{
int s,e,w;
}es[maxn];
bool spfa(int s)
{
int i;
for(i=1;i<=v;i++)
{
dis[i]=info;
flag[i]=0;
times[i]=0;
}
dis[s]=0;
q.push(s);
times[s]++;
while(!q.empty())
{
int t = q.front();
q.pop();
flag[t]=0;
for(i=1;i<=e;i++)
{
if(dis[es[i].e]>dis[es[i].s]+es[i].w)
{
dis[es[i].e]=dis[es[i].s]+es[i].w;
if(flag[es[i].e]==0)
{
q.push(es[i].e);
flag[es[i].e]=1;
times[es[i].e]++;
if(times[es[i].e]==v)
return false;//存在负环
}
}
}
}
return true;
}
int main()
{
scanf("%d%d",&v,&e);
for(int i=0;i<e;i++)
{
scanf("%d%d%d",&es[i].s,&es[i].e,&es[i].w);
}
if(spfa(0))
{
for(int i=0;i<v;i++)
{
printf("%d\t",dis[i]);
}
}
return 0;
}