设G =(V,E)是无向图,s和t是V中的两个顶点。图的每个边都用红色或蓝色着色。我需要找到一种算法,找到s和t之间的路径,其中红色边缘的数量最少。
我考虑了以下算法:修改后的BFS算法
对于每个顶点,我们将使用一个名为“红色级别”的额外字段,它将指示从s到此顶点的路径上的最小红边数。一旦我们发现了一个新的顶点,我们将更新其红色级别字段。如果我们正在尝试探索已经发现的顶点,如果此顶点的红色级别大于当前红色级别,那么我们将从BFS树中删除此顶点并将其作为子节点的子节点插入其中正在探索,等等。 所需的路径是在算法运行结束时在BFS树中连接s和t的路径。
我现在正在尝试证明这个算法是正确的,但收效甚微。我也不确定它是否确实是正确的。任何提示/想法?
答案 0 :(得分:6)
我认为这是正确的:从根本上你做Dijkstra's algorithm,红色边缘的权重非常大,蓝边的权重非常小或为零。
答案 1 :(得分:0)
遗憾的是,该算法不正确。 请看下面的图表: G =(V,E); V = {s,a,b,c,d,e,t}; E = {(s,a),[s,b],[s,d],(a,b),[b,c],[d,e],(c,t),(e,t) };
(为方便起见,我为蓝色无向边标记了(,),为红色边标记了[,])
假设算法选择在'a'之前探索'b'。 当我们完成's'时,我们将'a'表示红色等级0,'b'和'd'表示红色等级1.从'd'开始探索我们将'e'红色等级2.现在我们从'b'探索:'s'和'a'保持不变,但'c'变为红色等级2.接下来我们探索'a'(根据BFS!),然后它将'b'的父级更改为'a',将红色级别'b'更改为0.请注意,在这一点上 - 从's'到'c'的路径是正确的,但是红色级别在'c'上不是 - 它应该是1而不是2.现在,我们继续前进,我们从'e'开始(我们用's'和它的直接孩子做'a','b'和'd'):我们用边缘(e,t)发现't',所以't'得到红色等级2.边缘(e,d)什么都没改变。现在我们进入了很酷的部分 - 从'c'探索:边缘(c,b)没有任何变化,但边缘(c,t)怎么样? 't'已经被发现(来自'e'),所以根据你的算法我们只改变一些东西,如果红色水平有差异。但是没有,因为'c'的红色等级是2(错误!)。因此't'的父级仍为'e',而来自's'的路径包含2个红色边缘,而从's'到't'的路径仅包含1个红色边缘:s - > a - > b - > c - >吨