我想解决的问题是:
给出一个图表,其中每条边都用红色或蓝色着色:
a)给出一个算法,该算法产生两个顶点(s,t)之间的路径,该路径越过最小量的红色边缘。
b)给出一个算法,该算法产生两个顶点(s,t)之间的路径,该路径越过最小量的蓝色边缘,从s到t的所有路径中通过最少量的红色边缘。到目前为止: 对于a)我可以使用修改的BFS算法。查看顶点时,v将所有通过蓝色边连接的顶点放在队列中的v中,然后将其余顶点添加到队列的末尾。因此,算法第一次遇到t将是所讨论的路径。
如何证明此算法的正确性?看起来很贪心。如何将其展开以回答b)?
感谢您的时间。
答案 0 :(得分:2)
您需要记住有关算法的两个重要细节:
t
从队列中取出后才能停止算法,而不是在您将其放入后立即停止。如果你这样做(而你的问题并不表示你没有),你的算法确实是正确的。
如何证明此算法的正确性?
如果将边缘权重1
分配给红色边缘并将边缘权重0
分配给蓝色边缘,则问题会减少,以便在变换后的图形中找到最短路径。让Dijkstra应用这个问题。我将证明你的算法实际上实现了Dijkstra,证明了它的正确性。
我们可以证明我们在优先级队列中只有两个不同距离的节点:如果m
是优先级队列中节点的最小距离,那么我们就不能有一个距离节点{ {1}}在队列中,因为这意味着我们必须已经探索了距离为m + 2
的节点,这是不可能的,因为我们按距离增加的顺序探索节点。
您修改的BFS实际上使用双端队列作为2值优先级队列来实现Dijkstra算法:如果m + 1
是您的队列,那么有一个索引Q
,这样{ {1}}仅包含距离为i
的节点,而Q[1..i]
仅包含距离为m
的节点。
如何将其展开以回答b)?
您可以通过维护4值优先级队列来扩展概念,例如实现为两个双端队列。一个队列将保持距离Q[i+1..]
红色边缘的节点,另一个队列将保持距离m + 1
红色边缘的节点。两者都是通过增加蓝色边缘的数量来排序的(每个边缘中也只有两个不同的距离值)。
答案 1 :(得分:0)
[[如果您将节点放在队列前面的蓝色边缘附近而不是评论中讨论的队列末尾,则提到的算法是正确的。]]
对于问题(B),只丢弃不在原始最短路径中的边缘(使用最小红色边缘)。如果边缘u-v在最短路径中,则很容易找到。如果距离[来源] [u] +费用[u] [v] +距离[v] [目的地] =距离[来源] [目的地],则u-v处于最短路径。在丢弃额外边缘之后,任务的其余部分很容易。