Bellman-Ford——解决负权边(求某点到所有点的最短距离)
来源:互联网 发布:淘宝开网店是免费的吗 编辑:程序博客网 时间:2024/06/11 02:27
Bellman-Ford与dijkstra一样 都是求某点到所有点的最短距离
先说一下Bellman-Ford的思路:将m条变全部枚举(假设第i条边连接的点是u[i].v[i])判断v[i]到起点的距离是否可以通过v[i]到u[i]的距离和u[i]到起点的距离和替换从而更新dis[v[i]],显然,第一次循环一定会将离起点最近的点更新至最小,第二次循环又会将除起点外离离起点最近的点最近的点(有点绕,多看几遍)更新,以此类推,最多循环n-1次就能将所有dis更新。当然也有可能,一次循环就更新了所有的dis至最小值,这个待会再考虑。(这种更新称为“松弛”)
核心代码:
for(k=1;k<=n-1;k++){for(i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];}}}
完整代码:
#include<cstdio>using namespace std;int main(){int i,j,k,m,n,u[10],v[10],w[10],dis[10];const int inf=99999999;scanf("%d %d",&n,&m);for(i=1;i<=m;i++){scanf("%d %d %d",&u[i],&v[i],&w[i]);}for(i=1;i<=n;i++){dis[i]=inf;}dis[1]=0;for(k=1;k<n;k++){for(i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];}}}for(i=1;i<=n;i++){printf("%d ",dis[i]);}return 0;}显然算法复杂度是O(NM)。
之前也说过,有可能不需要n-1轮就已经更新完毕,所以我们需要一个判断变量,判断每一轮松弛,如果m条边都没有更新dis,那么说明更新完毕,直接break;
另外,Bellman-Ford显然可以判断有没有负权环,之前已经分析过,最多n-1轮,就可以将所有的dis更新至最小,若第n轮还能继续更新,说明存在负权环。
核心代码:
for(k=1;k<=n-1;k++){for(i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];}}}//更新 flag=0;for(i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){flag=1;break;}}if(flag==1)printf("有负权环");//判断负权环
1 0
- Bellman-Ford——解决负权边(求某点到所有点的最短距离)
- Bellman-Ford的队列优化(求某点到所有点的最短距离)
- 最短路径(三)—Bellman-Ford算法(解决负权边)
- Bellman-Ford——解决负权边
- Bellman-Ford算法——解决负权边
- Bellman-Ford算法——解决负权边
- 6.3Bellman-Ford——解决负权边
- Bellman-Ford-解决负权边—C
- Bellman-Ford------解决负权边
- Bellman-Ford---解决负权边
- Bellman-Ford -解决负权边
- Bellman-Ford-解决负权边
- Bellman-Ford算法—求解带负权边的最短路径
- 最短路——Bellman-Ford
- 最短路——Bellman-ford算法
- 最短路——Bellman-Ford算法
- 最短路径——Bellman-Ford
- 最短路径算法—Bellman-Ford
- 用网页前后台来实现生产者消费者,前台用于显示,后台用于实现算法。
- 什么才是真正的 RESTful 架构?
- 嘉华线走向及时刻表
- Android手机视频监控系统
- 基础软件国产化闲谈
- Bellman-Ford——解决负权边(求某点到所有点的最短距离)
- Android08--Android之基本组件Activity
- 这就是搜索引擎(三)——搜索引擎优化
- CONCAT()函数 和 GROUP_CONCAT()函数
- 1057 津津的储蓄计划
- 编程语言的排名取决于应用场景和主要公司的需求
- Android0828(一)
- VirtualBox主机与虚拟机文件夹共享
- Viewpager自动轮播,可修改滑动速度