您的位置:首页 > 其它

最短路之bellman-ford算法

2018-01-27 17:46 155 查看
先来说下bellman-ford算法的基本思想。假设在一个有向图中有n个点,那么从源点到任意其他一点的最短路径数量肯定不超过n - 1(假设不含回路)。那样放松一下限制的话,对于任意一条路径来说,将n - 1条边都尝试着“松弛”一下,那样的话,肯定就可以将这条路径变为最短路。

对于bellman-ford算法来说的话,它是采用类似于floyd算法的方式,每次外循环代表对每个点最多加入可以松弛边的数量。每次内循环代表每条边是否可以进行松弛。

对于判断负圈的循环,可以用反证法的思想,假设不含负圈,那样的话,加入n - 1 条边后,路径肯定为最短路,如果再加一条边,会产生环,如果是正环,松弛操作不会发生,如果是负环,松弛操作会发生。

bool Bellman_Ford(int v0)
{
for(int i = 1; i <= n; ++i) //初始化,起点本身赋值为0,其余赋值为最大
dis[i] = (i == v0 ? 0 : MAX);
for(int i = 1; i <= n - 1; ++i)
for(int j = 1; j <= m; ++j)
if(dis[edge[j].v] > dis[edge[j].u] + edge[j].cost) //松弛(顺序一定不能反)
{
dis[edge[j].v] = dis[edge[j].u] + edge[j].cost;
pre[edge[j].v] = edge[j].u;
}
bool flag = 1; //判断是否含有负权回路
for(int i = 1; i <= edgenum; ++i)
if(dis[edge[i].v] > dis[edge[i].u] + edge[i].cost)
{
flag = 0;
break;
}
return flag;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: