最短路之bellman-ford算法
2018-01-27 17:46
155 查看
先来说下bellman-ford算法的基本思想。假设在一个有向图中有n个点,那么从源点到任意其他一点的最短路径数量肯定不超过n - 1(假设不含回路)。那样放松一下限制的话,对于任意一条路径来说,将n - 1条边都尝试着“松弛”一下,那样的话,肯定就可以将这条路径变为最短路。
对于bellman-ford算法来说的话,它是采用类似于floyd算法的方式,每次外循环代表对每个点最多加入可以松弛边的数量。每次内循环代表每条边是否可以进行松弛。
对于判断负圈的循环,可以用反证法的思想,假设不含负圈,那样的话,加入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; }
相关文章推荐
- 最短路问题 Bellman-Ford算法
- 最短路 bellman-ford算法
- 单源最短路 bellman_ford算法(模板)
- 最短路的Bellman-Ford算法 【判断有无负权环】
- 最短路之Bellman-Ford算法
- 最短路——Bellman-ford算法
- 最短路--Bellman-Ford算法
- poj 3259 Wormholes(最短路Bellman-Ford算法)
- 单源最短路之bellman-ford算法(解决有负权存在的情况)
- 2544 最短路 Dijkstra算法 Floyd算法 Bellman_Ford算法 SPFA算法
- poj 1860 Currency Exchange (最短路,Bellman-Ford算法)
- bellman-ford算法(最短路、最短路劲)
- 最短路之Bellman-Ford算法
- 单源最短路之spfa算法代码(bellman-ford算法的队列优化)
- 单源最短路 Bellman-Ford算法
- 最短路——Bellman-Ford算法
- ACM暑期集训——专题二[最短路Bellman-Ford算法]
- C--最短路(Bellman-Ford算法)
- [算法与数据结构] - No.10 图论(3)- 最短路Dijkstra算法、Bellman-Ford算法和Floyd算法
- bellman-ford算法 最短路