所以我的问题是我有一个带有非负边长的有向图G,我希望找到两个节点u和v之间的最短路径,这样它们只能通过一个标记的节点在图中。
如果我们没有涉及标记节点的条件,则可以使用Dijkstra算法轻松解决此问题。
procedure dijkstra(G, l, s)
Input: Graph G = (V, E), directed or undirected;
positive edge lengths {le : e ∈ E}; vertex s ∈ V
Output: For all vertices u reachable from s, dist(u) is set to the distance from s to u.
for all u ∈ V :
dist(u) = ∞
prev(u) = nil
dist(s) = 0
H = makequeue(V ) (using dist-values as keys)
while H is not empty:
u = deletemin(H)
for all edges (u, v) ∈ E:
if dist(v) > dist(u) + l(u, v):
dist(v) = dist(u) + l(u, v)
prev(v) = u
decreasekey(H, v)
此外,为了处理这个条件,我正在考虑添加一个值,该值给出了从s到u的当前最佳路径中的当前节点数(这将在更新dist(u)时更新)。但这似乎不起作用,因为算法没有跟踪我们用一个或更少节点看到的所有可能路径,而只是跟踪最低距离路径。
我的问题是我是否在正确的轨道上,只需要另外修改算法?或者是否有另一种算法可以更轻松地实现这一目标?
此外,这是一个家庭作业问题所以请不要发布整个解决方案,我只是在寻找指导。
答案 0 :(得分:4)
由于您不想要整个解决方案,我会给您一些提示。停止阅读每个段落然后尝试解决问题,我会尝试从更一般的提示转到更具体的提示。
首先,我认为您当前的想法无法解决问题。所以我将尝试引导您采用不同的方法。想到Dijkstra是一个好主意,但不要修改Dijkstra,而是考虑转换图,以便在新图中运行Dijkstra解决原始问题。
如何删除P组的原始限制?嗯,重要的是图表是针对的(或至少对我的想法)。想象一种转换图形的方法,以便强制如果你输入P的一个节点,你就不能再次输入P的另一个节点。
最后的想法,还没有给出解决方案。考虑复制图形,可能会删除一些边缘并以某种方式连接两个副本中的节点。