关于Bellman-Ford的几点思考

2024-03-01 23:32
文章标签 思考 几点 bellman ford

本文主要是介绍关于Bellman-Ford的几点思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于Bellman-Ford的几点思考:

1.bellman-ford基本思想?

 s集合为,为与源点已经连接的点的集合,p为与源点不连通的集合。

 开始时置s={源点}p={剩下的点}

 每次操作枚举所有边把符合条件的边上的点,加入s,或者更新其dis值,直到s={所有点}

2.为什么是做n-1次松弛操作

 每次松弛操作至少加一个节点加入到s中,因此松弛操作的次数的上限是n-1

3.为什么dis[a]+w<dis[b] 就出现负回路

 因为若在经过n-1次松弛操作后dis[a]+w<dis[b],dis[b]肯定在前面跟新为dis[a]+w;而现在出现了dis[a]+w<dis[b],要么dis[b]变大了,要么dis[a]变小了,而dis[b]变大是不可能的,并且w是常量,所以是dis[a]变小了。

用反证法证明:

   假设不存在负回路,

dis[a]变小了,只能存在这种情况:

     

---最后一次松弛操作是把d加进s,而u+v<x,dis[a]dis[c]+x跟新为dis[c]+u+v;dis[a]刚好变小而,ab这条边在cdda之前已经被枚举过,所以dis[b]没被跟新为dis[c]+u+v+w;所以出现了dis[a]+w<dis[b]这个情况.

         

然而经过n-1次松弛操作后,这种情况是不存在的。

因为在c加入s后,cd这条边满足条件(dis[c]+u<dis[d](dis[d]初始话为无穷)),d可以直接加入s中,

c是第k次加入s中的,

若在第k次中,cd是在c已经加入s中后再枚举的,那么在第k次中,d被直接加入到s中,

若在第k次中,cd已经在c加入s中前已经枚举过,那么在第k+1次中,d被加入到s中;

 

所以若d是第n-1次松弛操作的时候加进s的,那么c肯定最早是在第n-2次加入s的。

 

     

c是通过Cic这条边连到s的,ci是通过ci-1连到s的,ci-2...

c是最早是在第n-2次加入的,那么ci最早是在第n-3次加入的,那么ci-2.....

C1最早是在第0次加入的(c1是源点),所以i=n-3+1,即i>=n-2;而节点总共只有n个,除去cd,那么ab肯定是c1ci中的某两个点,那么c肯定和ab构成了回路,

ac的前面,

ac经过的边中没有负边,那么dis[c]>=dis[a],a又通过cdis[a]被更新为dis[c]+x,dis[c]+x<dis[a],推出x<0,所以在ac所在回路中出现了负边,即出现了负回路,与假设矛盾。

ac经过的边中出现了负边,那么也出现了负回路,与假设矛盾。

 

 

Bellman-ford算法代码:

Dis[i]i到源点的距离,edges为结构体,edges.aedges.b的权值是edges.w

int relax(int u,int v,int w)

 {

  if (dis[u]+w<dis[v])

    {

      dis[v]:=dis[u]+w;

      pre[v]:=u;

    }

 }

 bool bellman_ford()

 {

  int i,j;

  for(i=1;i<=n-1;i++)

    for(j=1;j<=e;j++)

      relax(edges[j].a,edges[j].b,edges[j].w);

  for(i=1;i<=e;i++)

      if (dis[edges[i].a]+w<dis[edges[i].b]) return false;//出现负回路

  return true;

 }

 

 

这篇关于关于Bellman-Ford的几点思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764188

相关文章

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

爬虫阶段思考

内容:写这篇文章是因为最近帮同学改了很多的爬虫代码,感触良多。 我用豆瓣为例,并不是不会用别的,而是这个我个人感觉最经典。然后还会写我遇到的一些问题以及解决方法。 首先,我们得先知道怎样爬取。我用的scrapy框架爬取。 我对此图的理解就是: 从spiders中获得一个请求(REQUEST),通过引擎传递给调度器,之后再返回给引擎,引擎把url封装好后传递给下载器,下载器将资源下载好后

关于微信没有接入鸿蒙NEXT的思考

6月21日,纯血鸿蒙发布,国内的质疑声终于停止,不再被人喊叫换皮 Android 了.就连编程语言都是华为自研的。 可是发布会后微信却成了热点,因为余承东在感谢了一圈互联网企业,如:淘宝、支付宝、美团、京东、抖音、今日头条、钉钉、小红书、微博、B站、高德、WPS等等. 唯独没有感谢腾讯. 中国互联网巨头只有哪么几家,腾讯、阿里、字节、拼多多、美团、百度、京东、华为 他们这些派系又诞生了无数

基于RAG的知识库AI代理机器人,问题思考

基于RAG的知识库AI代理机器人,问题思考 知识库内容分类 对于普通非qa问答格式的知识内容 在分段存储时,需要手动调整,保证每个分段的内容意思完整,不被分割,当然段落也不宜过长,保证内容表达的意思到不可分割为止就行 对于qa问答格式的知识内容 通常需要对问题增加格外索引,因为fastgpt的模式是将问题和回答,作为完整的文本作为向量化的坐标,当问题和回答的内容过长时,使用问题向量化匹配

关于后台实践的一些疑问、思考与建议

1. 关于工具类 建议一个公司或者一个产品线的项目,使用统一的工具包,而不是每个项目都建立自己的工具类。包括一些枚举类,基础抽象类等也建议加到项目的基础工具包中。 如果要在自己项目中编写的工具类,尽量多实现一些常用的函数。或者让工具类直接继承一些框架中的常用工具类,如StringUtils可以继承common.lang中的StringUtils。 2. 关于日期和时间 从contro

一个问题的思考

问题:在32位的机器上对long型变量进行加减操作存在并发隐患,那么到底是不是这样的呢? 分析:long类型是64位,所以在32位机器上,对long类型的数据操作通常需要多条指令组合出来 ,无法保证原子性,所以并发的时候会出现问题。 对于JAVA并发编程中的一些问题: 可见性问题: 对于可见性,我们先看下定义: 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到。并发问题往往都是

Android不能调用java.awt的原因及解决办法和思考

android 里面不能使用awt,底层没有具体的实现awt android里面的窗口创建过程决定了界面只能是android里面的组建。 android的组件都是通过远程的IPC调用完成的,也就是说服务端有什么功能才能用什么功能。 不是所有用java写的程序都能在标准jvm中运行的。 android中的虚拟机是修改过的,跟标准的JVM不同,比如对一张图片的解析,android

最大流的Ford-Fulkerson方法初步

网络或者网络流是一种基本的数据结构,而最大流则是网络流上的基本问题。网络本质上是一个符合一定条件的有向带权图。而最大流是最大可行流的简称,可行流是一个定义在网络流上的符合一定条件的函数。这些定义条件对于算法的正确性是不可缺少的,不过本文不描述可行流的数学条件,只介绍最大流最常用的Ford-Fulkerson方法的原理。     如上左的权图称作容量网络,边权值表示该边的容量。

关于Confluence的解析与思考

买Confluence上CSDN,特殊折扣购买通道:http://bss.csdn.net/module/btc/atlassian/prduct_detail?project=445&module=34&product=10 Confluence是一个专业的企业知识管理与协同软件,一个专业的wiki,通过它可以实现团队成员之间的写作和知识共享。 一、 Confluence开放API接

一道C面试题的思考

一、前言 C语言真的是学无止境的感觉,大部分同学大学都会开设C语言课程。很多人把C语言二级过了就感觉入门了;对于那些在做嵌入式开发的工程师,几乎每天都要接触C语言,很多人会感觉自己C语言学得很溜了。那好,咱们用一道C语言面试题来测试一下。 二、面试题 首先给出题目: 定义一个宏,求两个数中的最大数 OK,很多人应该能很快写出 #define MAX(x,y) x > y ? x :