对于作业,我必须创建一个Steiner Tree。然而,这不是典型的施泰纳树,因为我们需要使用的图结构不允许插入新的顶点。相反,测试用例定义了 N 个顶点和 M 个边的图结构,同时专门将 X 个顶点标记为目标节点。这些是我们在使用图中的一些、没有或所有未标记的顶点时必须跨越的节点。
我对这个问题的解决方案是
- 实现Dijkstra 算法以找到所有目标顶点之间的最短路径
- 对于每条最短路径 1:n
- 将所有当前选定的路径顶点提取到一个集合中
- 将所有剩余的顶点提取到一个集合中
- 对于当前选定路径的所有顶点 1:m
- 执行 Dijkstra 以找到当前顶点和其他路径顶点之间的最短路径
- 如果这会创建生成树,则将路径和长度保存在按长度值排序的优先级队列中
- 弹出优先级队列顶部和返回路径
我的问题是这是一个详尽的搜索,它使用 Dijkstra 的初始应用程序来创建一组可能的起始顶点的缩减集,用于比最小生成树更短的路径。
是否有可以解决此问题的启发式或其他算法?