算法目的:主要用于解决带负权的图计算单源最短路问题。
原理:基于动态规划,反复利用已经存在的边更新最短距离。
实现核心:通过松弛操作对数组dist进行松弛
核心代码:
bool bellmanford(int n,int m)
{
dis[0] = 0;
int i,j;
int flag=0;
for(i = 0; i <= n; i++)
{
flag = 0;
for(j = 0; j < m; j++)
{
if(dis[s[j].to] > dis[s[j].from] + s[j].w)
{
dis[s[j].to] = dis[s[j].from] + s[j].w;
flag = 1;
}
}
if(!flag)//某次不再更新
break;
}
if(flag)//执行了n-1次对比之后,每条边都被更新,那么存在负权回路
return true;
else
return false;
}
时间复杂度:O(n*m)