笔记:Bellman-Ford算法及队列优化(SPFA)算法

时间:2022-07-29 09:44:53

笔记:Bellman-Ford算法及队列优化(SPFA)算法

文中示例代码正如下:

//完整代码如下:头文件省略
int dis[10],u[10],v[10],w[10];
int main()
{
//freopen("*.in","r",stdin);
//freopen("*.out","w",stdout);

int i,k,n,m;
int inf=99999999; //用inf存储一个我们认为的正无穷值
cin>>n>>m;// 读入n和m,n表示顶点个数,m表示边的条数

//读入边
for(i=1;i<=m;i++)
cin
>>u[i]>>v[i]>>w[i];

//初始化dis数组,这里是1号顶点到其余各个顶点的初始路程
for(i=1;i<=n;i++)
dis[i]
=inf;
dis[
1]=0;

//Bellman-Ford核心语句,只有四行,可以解决负边权,但不能解决负权回路,可以判定是否有负权回路
for(k=1;k<=n-1;k++) //进行n-1轮松驰
for(i=1;i<=m;i++) //枚举每一条边
if( dis[v[i]] > dis[u[i]] + w[i] ) //尝试对每一条边松驰
dis[v[i]] = dis[u[i]] + w[i]; //如果条件成立,更新dis[]数组

//输出最终结果
for(i=1;i<=n;i++)
cout
<<dis[i]<<" ";
return 0;
}