如何解决给定无向图设计算法
问题:给定无向图G,顶点集V的子集H(即H是V的子集)和起始顶点s(s在V中)。
设计一种算法,该算法查找从s到所有顶点的最短路径的长度,以使路径不经过H中的任何中间顶点(这意味着您可以终止于H中的一个顶点,但不能经过H中的某个顶点顶点(以H为单位)。(如果没有这样的路径,则将长度设置为∞。所有边的长度都相同。)
(算法的输出应为类似于BFS和Dijkstra的dist数组的数组。)
解决方法
有一个简单的方法可以解决此问题:
- 为
V - H
运行Dijkstra,即除H
中的节点以外的所有节点。令输出为dist
。 - 对于
i
中的每个节点H
,最短路径的长度为min {dist[j] + w[i][j]}
,其中min
应用于{{1 }}(如果我们有一个邻接列表而不是矩阵,可以提高效率。)
因此,基本上,使用Dijkstra在j
中找到到节点 not 的最短路径。这样,到V-H
中节点的最短路径就是从H
中的节点到自身的最短扩展。 (对于H
中未直接连接到V-H
的节点,它们将∞作为问题状态。)
根据@jrook的评论,您提到所有边缘的长度都相同。然后,可以使用BFS代替Dijkstra。
另一个解决方案是在图形的修改版本上运行BFS:
- 同时删除
H
中节点内的所有边缘。 - 使
V-H
和H
中的节点之间的边缘指向从V-H
到H
的方向。 - 通过在两个方向上添加有向边来使所有其他边(即
V-H
中的节点之间的边)有向。
在此修改后的有向图中,您可以应用BFS或Dijkstra来找到所需条件的最短路径。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。