Bellman-Ford算法非常简单,核心代码只有4行,并且可以完美地解决带有负权边的图,可以检测负权回路。时间复杂度为O(NM)
int main()
{
int dis[50],u[50],v[50],w[50];
int inf=99999999;
int n,m,i,k,check;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
scanf("%d%d%d",&u[i],&v[i],&w[i]);
//初始化数组dis,顶点1到其余顶点的距离
for(i=1;i<=n;i++)
dis[i]=inf;
dis[1]=0;
//算法核心,对所有边进行n-1轮松弛
for(k=1;k<=n-1;k++)
{
check=0;//用来标记在本轮松弛中数组dis是否会发生更新
for(i=1;i<=m;i++)
{
if(dis[u[i]]+w[i]<dis[v[i]])
{
dis[v[i]]=dis[u[i]]+w[i];
check=1; //数组更新,改变check的值
}
}
if(check==0)
break; //如果数组dis没有更新,提前退出循环结束算法
}
//输出结果
for(i=1;i<=n;i++)
printf("%d ",dis[i]);
return 0;
}