【发布时间】:2022-10-05 23:26:20
【问题描述】:
除了具有非负权重的图之外,Dijkstra 算法是否需要连通性?例如。 dijkstra 算法是否适用于断开连接的图,其中 3 个顶点在一个组件中连接,另外 2 个顶点在另一个组件中?
-
如果您的图表断开连接,则算法要查找的组件之间没有路径,是吗?
除了具有非负权重的图之外,Dijkstra 算法是否需要连通性?例如。 dijkstra 算法是否适用于断开连接的图,其中 3 个顶点在一个组件中连接,另外 2 个顶点在另一个组件中?
这是 Dijkstra 的算法from Wikipedia:
- 标记所有未访问的节点。创建一个包含所有未访问节点的集合,称为未访问集。
- 为每个节点分配一个暂定距离值:对于我们的初始节点将其设置为零,对于所有其他节点将其设置为无穷大。在算法运行过程中,节点 v 的暂定距离是节点 v 与起始节点之间迄今为止发现的最短路径的长度。由于最初除了源本身(长度为零的路径)之外,任何其他顶点都不知道任何路径,因此所有其他暂定距离最初都设置为无穷大。将初始节点设置为当前节点。 [15]
- 对于当前节点,考虑其所有未访问的邻居并计算它们通过当前节点的暂定距离。将新计算的暂定距离与当前分配给邻居的距离进行比较,并将其分配为较小的距离。例如,如果当前节点 A 被标记为距离 6,并且连接它与邻居 B 的边的长度为 2,那么通过 A 到 B 的距离将是 6 + 2 = 8。如果 B 之前被标记为大于 8 的距离,然后将其更改为 8。否则,将保留当前值。
- 当我们考虑完当前节点的所有未访问邻居后,将当前节点标记为已访问并将其从未访问集中删除。将永远不会再次检查访问过的节点(这对于步骤 6 中的行为是有效且最佳的:下一个要访问的节点将始终按照“与初始节点的最小距离首先”的顺序,因此之后的任何访问都会距离更远)。
- 如果目标节点已被标记为已访问(在规划两个特定节点之间的路线时)或如果未访问集中的节点之间的最小暂定距离为无穷大(计划完整遍历时;发生在初始节点和剩余未访问节点之间没有连接时),则停止。算法完成。
- 否则,选择暂定距离最小的未访问节点,设置为新的当前节点,返回步骤3。
注意我强调的部分。这样一来,如果初始节点和目标节点之间没有路径,则一旦访问了初始节点组件中的所有节点,算法仍然会停止。
所以不,连接的图形不是必需的。该算法将告诉您路径是否存在。
【讨论】:
根据维基百科上的伪代码中给出的 Djikstra 算法(为方便起见,复制如下),与源的断开顶点距离将保持为INFINITY。您的问题的答案是否定的,即使图表断开连接,Dijkstra 的算法仍然会返回正确的结果。
1 function Dijkstra(Graph, source):
2
3 for each vertex v in Graph.Vertices:
4 dist[v] ← INFINITY
5 prev[v] ← UNDEFINED
6 add v to Q
7 dist[source] ← 0
8
9 while Q is not empty:
10 u ← vertex in Q with min dist[u]
11 remove u from Q
12
13 for each neighbor v of u still in Q:
14 alt ← dist[u] + Graph.Edges(u, v)
15 if alt < dist[v]:
16 dist[v] ← alt
17 prev[v] ← u
18
19 return dist[], prev[]
【讨论】: