首先介绍一下bellman算法:

Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写。即进行持续地松弛(原文是这么写的,为什么要叫松弛,争议很大),每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环,无法得出结果,否则就成功完成。Bellman-ford算法有一个小优化:每次松弛先设一个标识flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退出。Bellman-ford算法浪费了许多时间做没有必要的松弛,而SPFA算法用队列进行了优化,效果十分显著,高效难以想象。SPFA还有SLF,LLL,滚动数组等优化。

bellman的核心代码如下示例:

n,m分别代表点的个数和边的条数.

     for(int k=1;k<=n-1;k++)//遍历点的次数{for(int i=1;i<=m;i++)//遍历边的次数{if(dis[v[i]]>dis[u[i]]+w[i])//如果从u到v的距离能够通过w这条边压缩路径 就要进行松弛操作{dis[v[i]]=dis[u[i]]+w[i];}}}

两个for循环注定比弗洛伊德的复杂度低 效率会更高 .这时候我就想问了 为什么一定是经过k-1轮次的操作呢~?

为啥不是k-2或者更少呢?

这里就要考虑最坏的情况了~.如果需要松弛操作的地方比较多 那么松弛的轮数也会随之增加 .

但是并不是所有情况都需要k-1轮操作 那么如何优化算法呢?

这个时候算法大牛说话了:如果在当前一轮的操作中 没有经过松弛操作  那么这个时候就已经不用继续松弛了~

所以就有了如下代码~;

        for(int k=1;k<=n-1;k++){check=0;//用check检查是否进行下一轮次的操作for(int i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];check=1;}}if(check==0)break;}

这里要注意

                if(dis[v[i]]>dis[u[i]]+w[i])//如果从u到v的距离能够通过w这条边压缩路径 就要进行松弛操作{dis[v[i]]=dis[u[i]]+w[i];}

这只是在改变单源路径的权值.

只是在改变从u到v的权值

所以如果我们遇到的题目是无向图 如2544(杭电)就需要如下代码来完成操作:

        for(int k=1;k<=n-1;k++){check=0;for(int i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];check=1;}if(dis[u[i]]>dis[v[i]]+w[i]){dis[u[i]]=dis[v[i]]+w[i];check=1;}}if(check==0)break;}

这个时候这个题的主体算法就呈现出来了 这里贴上完整代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int dis[121212];
int u[121212];
int v[121212];
int w[121212];
int main()
{int n,m;int check;while(~scanf("%d%d",&n,&m)){if(n==0||m==0)break;for(int i=1;i<=m;i++){scanf("%d%d%d",&u[i],&v[i],&w[i]);}for(int i=1;i<=n;i++){dis[i]=0x1f1f1f1f;}dis[1]=0;for(int k=1;k<=n-1;k++){check=0;for(int i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];check=1;}if(dis[u[i]]>dis[v[i]]+w[i]){dis[u[i]]=dis[v[i]]+w[i];check=1;}}if(check==0)break;}printf("%d\n",dis[n]);}
}

bellman算法有一个特性是弗洛伊德所不能企及的一个点 :解决负权路问题;

这里贴上解决负权路问题的代码:(以2544为例)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int dis[121212];
int u[121212];
int v[121212];
int w[121212];
int main()
{int n,m;int check;while(~scanf("%d%d",&n,&m)){if(n==0||m==0)break;for(int i=1;i<=m;i++){scanf("%d%d%d",&u[i],&v[i],&w[i]);}for(int i=1;i<=n;i++){dis[i]=0x1f1f1f1f;}dis[1]=0;for(int k=1;k<=n-1;k++){check=0;for(int i=1;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];check=1;}if(dis[u[i]]>dis[v[i]]+w[i]){dis[u[i]]=dis[v[i]]+w[i];check=1;}}if(check==0)break;}int flag=0;//标记是否有负权回路...for(int i=0;i<=m;i++){if(dis[v[i]]>dis[u[i]]+w[i]){dis[v[i]]=dis[u[i]]+w[i];flag=1;}if(dis[u[i]]>dis[v[i]]+w[i]){dis[u[i]]=dis[v[i]]+w[i];flag=1;}}if(flag==1){printf("0\n");continue;}printf("%d\n",dis[n]);}
}

杭电 2544 最短路(bellman详解)相关推荐

  1. 解释一下java的短路运算,Java短路运算符和非短路运算符详解

    Java短路运算符和非短路运算符详解 时间:2017-09-15     来源:互联网 你了解Java短路运算符和非短路运算符吗?短路运算符就是我们常用的"&&". ...

  2. 人体热释电红外传感器 PIR 原理详解

    人体热释电红外传感器 PIR 原理详解     在电子防盗.人体探测器领域中,被动式热释电红外探测器的应用非常广泛,因其价格低廉.技术性能稳定而受到广大用户和专业人士的欢迎.本文详细介绍了被动式热释电 ...

  3. 最短路算法详解(Dijkstra/SPFA/Floyd)

    转自:http://blog.csdn.net/murmured/article/details/19281031 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短 ...

  4. 电商库存系统设计mysql_详解:电商系统库存逻辑的设计

    原标题:详解:电商系统库存逻辑的设计 本文主要对电商平台的订单系统相关库存逻辑进行了详细的阐述,一起来文中看看~ 一.库存的概念 电商的业务场景中订单的流程常常伴随着库存的变化:对于erp来说,库存可 ...

  5. 电商系统开发功能详解

    电商系统开发,电商系统开发功能,电商系统开发详解.电商系统开发工作中进行以前必须做好全方位方案和综合,要明确构建电商系统的目的性和功能性规定,确立自身构建怎样的电商系统,那样能够让构建开发设计过程做到 ...

  6. 计算机主机电池馈电,电脑主板电池没电了表现 电脑主板电池没电了解决方法【详解】...

    我们的生活和工作离不开电脑,是我们的好帮手.但是电脑是机器,难免会出现一些问题,我们都会使用电脑,可是在电脑出现故障,很多人却束手无策.比如 电脑主板电池没电了,会对电脑有什么影响,对于这个问题,很多 ...

  7. 小程序电商系统后台功能详解

    如何使用小程序电商系统后台,今天小来给大家讲解一下来客小程序电商系统. 首先,我们来看首页,首页上有一些基本的情况,比如说订单的情况待付款.待发货.待收货.待评价.退货等,还有今日营业额.今日订单数. ...

  8. 京东、京东全球购、考拉等电商平台入驻费用详解

    (一)京东入驻 首先 京东的入驻标准,京东的入驻标准包括以下3个部分: 1.京东开放平台招商基础资质标准.商家必须以公司的名义入驻,目前京东不支持个人入驻; 2.各个类目招商资质标准.目前,京东的主要 ...

  9. IP网络安全可信技术西电捷通TISec应用场景详解

    摘要  TISec(IP网络安全可信技术,Trust of IP Security,简称TISec)是一项用来保护 IP 协议的的安全技术,也是西电捷通三元对等鉴别安全架构在IP安全领域的应用实例.它 ...

最新文章

  1. BIOS interviews
  2. 使用Duilib做桌面应用总结
  3. ansible安装部署_运维日记|使用ansible批量部署crontab定时删归档任务
  4. JPA J2SE 桌面应用范例
  5. asp.net 返回超时的解决方法
  6. 【竞赛算法学习】学术前沿趋势分析-论文数据统计
  7. Activity、Fragment、Dialog基类简单整理
  8. iphone登录不了媒体服务_ios快捷指令一键登录校园网(桂航为例,哆点认证)
  9. 浅谈SpringMVC之DispatcherServlet
  10. 为何python不好找工作-学完Python,为什么还找不到工作?现实很残酷!
  11. swift 可选链_Swift可选链
  12. MongoDB 将Json数据直接写入MongoDB的方法
  13. 电商后台管理系统(一)
  14. Eclipse设置护眼浅绿色背景
  15. Mysql主从同步时Slave_IO_Running:Connecting ; Slave_SQL_Running:Yes的情况故障排除
  16. 多台电脑共用一根网线如何设置宽带共享
  17. 用计算机公式计算优良,『excel怎样合并单元格』如何在EXCEL中如何用公式计算全年级各班各科平均分、优秀率、合格率的方法...
  18. 倒计时不到1天!iPhone 11系列起售价预测,或将成为新的“真香机”
  19. openstack上cinder卷的加密
  20. 蓝桥杯真题:天干地支

热门文章

  1. Android设置iptable实现外网访问
  2. Android攻城狮datePicketimePicker
  3. macbook android 热点,Mac_mac如何做热点?mac创建wifi热点方法介绍,  如果是家里有路由器的, - phpStudy...
  4. SQL DUMB Series-3 4 通关过程分享(sql注入学习DAY2)
  5. VINS-Mono翻译
  6. SpringBoot整合Mybatis-Plus
  7. RTKLIB学习总结(六)导航电文、卫星位置计算
  8. DHCP spoofing,DHCP snooping,傻傻分不清
  9. Playwright之初体验
  10. matlab 显示程序进度条,matlab学习---------------进度条waitbar