- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果存在一个加权图 G
,并且所有权重都是0
,Dijkstra算法是否仍然找到最短路径?如果是,为什么?
根据我对算法的理解,如果没有边权重,Dijsktra 的算法将像普通的BFS 一样运行,但我希望得到一些说明。
最佳答案
根据算法的定义,Dijkstra 本身对 0
权重没有问题。它只会在负权重时出现问题。
因为在每一轮中,Dijkstra 都会结算一个节点。如果您稍后发现负权重边,这可能会导致到达该已解决节点的较短路径。然后节点需要未解决,Dijkstras 算法不允许(并且会破坏算法的复杂性)。如果您看一下实际的算法和一些插图,就会明白这一点。
Dijkstra 在这样一个全零图上的行为与所有边都具有不同但相同的值一样,例如 1
(除了得到的最短路径长度)。 Dijkstra 将简单地访问所有节点,没有特定的顺序。基本上,就像普通的广度优先搜索。
看看Wikipedia的算法描述:
1 function Dijkstra(Graph, source):
2
3 create vertex set Q
4
5 for each vertex v in Graph: // Initialization
6 dist[v] ← INFINITY // Unknown distance from source to v
7 prev[v] ← UNDEFINED // Previous node in optimal path from source
8 add v to Q // All nodes initially in Q (unvisited nodes)
9
10 dist[source] ← 0 // Distance from source to source
11
12 while Q is not empty:
13 u ← vertex in Q with min dist[u] // Node with the least distance
14 // will be selected first
15 remove u from Q
16
17 for each neighbor v of u: // where v is still in Q.
18 alt ← dist[u] + length(u, v)
19 if alt < dist[v]: // A shorter path to v has been found
20 dist[v] ← alt
21 prev[v] ← u
22
23 return dist[], prev[]
负值的问题在于 15
和 17
行。当您删除节点 u
时,您就解决了它。也就是说,你说到这个节点的最短路径现在是已知的。但这意味着您不会再将 17
行中的 u
视为某个其他节点的邻居(因为它不再包含在 Q
中) .
对于负值,您稍后可能会发现到该节点的更短路径(由于负权重)。您需要在算法中再次考虑 u
,并重新执行所有依赖于先前到 u
的最短路径的计算。因此,您需要添加 u
以及从 Q
中删除的所有其他节点,这些节点在返回 Q 的最短路径上有
。u
特别是,您需要考虑可能通向目的地的所有边,因为您永远不知道某些讨厌的-1_000_000
加权边隐藏在哪里。
下面的例子说明了这个问题:
Dijkstra 将红色路径声明为从A
到C
的最短路径,长度为0
。但是,还有一条更短的路径。它标记为蓝色,长度为 99 - 300 + 1 = -200
。
使用负权重,您甚至可以创建更危险的场景,负循环。这是图中总权重为负的循环。然后,您需要一种方法来停止一直沿循环移动,无休止地降低当前的体重。
在无向图中,权重为 0
的边可以被消除,节点可以被合并。它们之间的最短路径的长度始终为 0
。如果整个图只有 0
权重,则该图可以只合并到一个节点。每个最短路径查询的结果都只是0
。
如果在两个方向上都有这样的边,那么对于有向图也是如此。否则,您将无法进行优化,因为您会更改节点的可达性。
关于algorithm - Dijkstra 算法可以在权重为 0 的图上工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49460439/
我在Windows 10中使用一些简单的Powershell代码遇到了这个奇怪的问题,我认为这可能是我做错了,但我不是Powershell的天才。 我有这个: $ix = [System.Net.Dn
var urlsearch = "http://192.168.10.113:8080/collective-intellegence/StoreClicks?userid=" + userId +
我有一个非常奇怪的问题,过去两天一直让我抓狂。 我有一个我试图控制的串行设备(LS 100 光度计)。使用设置了正确参数的终端(白蚁),我可以发送命令(“MES”),然后是定界符(CR LF),然后我
我目前正试图让无需注册的 COM 使用 Excel 作为客户端,使用 .NET dll 作为服务器。目前,我只是试图让概念验证工作,但遇到了麻烦。 显然,当我使用 Excel 时,我不能简单地使用与可
我开发了简单的 REST API - https://github.com/pavelpetrcz/MandaysFigu - 我的问题是在本地主机上,WildFly 16 服务器的应用程序运行正常。
我遇到了奇怪的情况 - 从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django View 创建相同的对象看起来成功,但 MongoDB 中没有出现任何数据。
我是 flask 的新手,只编写了一个相当简单的网络应用程序——没有数据库,只是一个航类搜索 API 的前端。一切正常,但为了提高我的技能,我正在尝试使用应用程序工厂和蓝图重构我的代码。让它与 pus
我的谷歌分析 JavaScript 事件在开发者控制台中运行得很好。 但是当从外部 js 文件包含在页面上时,它们根本不起作用。由于某种原因。 例如; 下面的内容将在包含在控制台中时运行。但当包含在单
这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它: 这是我的解决方案: 'use strict'; const zmq = require('zeromq
我正在阅读文本行,并创建其独特单词的列表(在将它们小写之后)。我可以使它与 flatMap 一起工作,但不能使它与 map 的“子”流一起工作。 flatMap 看起来更简洁和“更好”,但为什么 di
我正在编写一些 PowerShell 脚本来进行一些构建自动化。我发现 here echo $? 根据前面的语句返回真或假。我刚刚发现 echo 是 Write-Output 的别名。 写主机 $?
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我将一个工作 View Controller 类从另一个项目复制到一个新项目中。我无法在新项目中加载 View 。在旧项目中我使用了presentModalViewController。在新版本中,我
我对 javascript 很陌生,所以很难看出我哪里出错了。由于某种原因,我的功能无法正常工作。任何帮助,将不胜感激。我尝试在外部 js 文件、头部/主体中使用它们,但似乎没有任何效果。错误要么出在
我正在尝试学习Flutter中的复选框。 问题是,当我想在Scaffold(body :)中使用复选框时,它正在工作。但我想在不同的地方使用它,例如ListView中的项目。 return Cente
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我有一个组合框,其中包含一个项目,比如“a”。我想调用该组合框的 Action 监听器,仅在手动选择项目“a”完成时才调用。我也尝试过 ItemStateChanged,但它的工作原理与 Action
你能看一下照片吗?现在,一步前我执行了 this.interrupt()。您可以看到 this.isInterrupted() 为 false。我仔细观察——“这个”没有改变。它具有相同的 ID (1
我们当前使用的是 sleuth 2.2.3.RELEASE,我们看不到在 http header 中传递的 userId 字段没有传播。下面是我们的代码。 BaggageField REQUEST_I
我正在尝试在我的网站上设置一个联系表单,当有人点击发送时,就会运行一个作业,并在该作业中向所有管理员用户发送通知。不过,我在失败的工作表中不断收到此错误: Illuminate\Database\El
我是一名优秀的程序员,十分优秀!