Computer science 彩色边图中的最短路径

Computer science 彩色边图中的最短路径,computer-science,graph-theory,graph-algorithm,Computer Science,Graph Theory,Graph Algorithm,在无向连通图中,每条边都有一种颜色(红色、绿色或蓝色)。 有效路径是每种颜色至少有一条边的路径。 问题是如何找到最短有效路径或确定不存在最短有效路径 我尝试使用BFS,但无法找到解决方案。 有没有关于如何开始的想法?我会使用BFS,从每个节点开始,我会计算从该节点可以发现的第一条有效路径,保存该值,然后转到下一条 图形可以用矩阵表示,每个边的颜色(例如,-1(无边),0,1,2)作为矩阵中边的值 当您发现这些路径时,可以将它们放入一对数组中,一个保存路径中的步骤,另一个检查三种颜色 首先,我假设

在无向连通图中,每条边都有一种颜色(红色、绿色或蓝色)。
有效路径是每种颜色至少有一条边的路径。
问题是如何找到最短有效路径或确定不存在最短有效路径

我尝试使用BFS,但无法找到解决方案。

有没有关于如何开始的想法?

我会使用BFS,从每个节点开始,我会计算从该节点可以发现的第一条有效路径,保存该值,然后转到下一条

图形可以用矩阵表示,每个边的颜色(例如,-1(无边),0,1,2)作为矩阵中边的值


当您发现这些路径时,可以将它们放入一对数组中,一个保存路径中的步骤,另一个检查三种颜色

首先,我假设颜色的数量是固定的。 然后,我将提出一种标签设置Dijkstra算法(与Pareto-Dijkstra相比),其运行时间为O(n log(n)+m):

使用广义Dijkstra查找最短路径: 每个节点都有一个标签列表,其中一个标签包含从开始节点开始的长度和所有已访问的颜色。 如果(1)一个标签的长度较短,并且(2)它包含其他标签的所有颜色,则该节点中的一个标签将支配另一个标签。主控标签直接移除。 与dijkstra类似,您可以保留一个优先级队列,从该队列中,您可以始终放松长度较小的节点。将边移到节点v将使标签的长度增加端点长度,并将边的颜色添加到标签。标签将添加到节点v的标签列表中。 使用包含所有三种颜色的标签设置目标节点时,您已经找到了最短路径。 请注意,如果要在末端重建最短路径,则必须为每个标签保存前置节点

从起始节点的初始标签(0,{})(长度为零,没有颜色)开始

每个节点在每个颜色集组合中最多可以设置一次,因为只有8个(固定的)这样的组合。在这种情况下,运行时间等于Dijkstra算法 这是O(n*log(n)+m)的最佳实现。

要创建一个新图形(6次),它由原始图形的三个副本组成,第一个副本仅包括一种颜色的边,第二个副本还包括另一种颜色的边,并将它们与第二种颜色的边连接,第三个副本将具有所有边,并与第二个图形连接,该图形具有第三种颜色的边。 然后运行dijkstra查找从s1到t3的最短路径。
由于我们不知道什么是顺序,我们将对全部6种可能的颜色顺序执行相同的操作,然后从我们得到的6条最短路径中选择最短路径。

确实存在一个简单的解决方案,如下所示

假设没有颜色,在图上做一个正常的dijkstra

猜猜每种颜色的三条边。对于所有m^3可能的猜测,让边为r1---r2,b1---b2,g1---g2,我们得到了24种可能的路径方式(8种用于确定边的方向,6种用于排列)

因为你已经有了正常的dijkstra数据,一旦你完成了这个,你会在固定的时间内得到结果,最小化所有的猜测

对所有n个顶点重复此操作


我确实同意最后的复杂度O(nm^3)通常太大,但有时琐碎的算法可以工作

这个问题可以通过产品结构来解决。创建一个新的有向图,其中每个顶点是原始图中的一对顶点和颜色的子集。(因此,对于3种颜色,对于原始图形中的每个顶点,新图形中将有8个顶点。)如果原始图形中的顶点之间存在边,且目标顶点的颜色集等于源顶点的颜色集加上原始图形中的边颜色,则在新图形中的两个顶点之间添加边(如果颜色已在源顶点的颜色集中,则不会更改)。新边应具有与原始边相同的权重

然后新图形中的最短路径从(s,∅) to(t,{red,green,blue})对应于使用所有3种颜色的原始图中从s到t的最短路径。由于新图中只有线性更多的顶点和边(假设一个固定的颜色集),该问题可以像普通最短路径问题一样快地渐近求解

作为一个实现细节,请注意,不需要在内存中实际记录整个乘积图。可以在运行最短路径算法时动态生成顶点和边,从而允许完全跳过未使用的顶点

此方法与略有不同,因为它扩展了顶点标签而不是路径权重


我已经提出并回答了这个问题的更一般形式。

在最坏的情况下,这不是需要很长的运行时间吗?好的,所有对最短路径通常是n^3,因此您的解决方案可能会有相当高的运行时间。一旦您确定了可行的解决方案形状,您应该能够找出如何保存r运行时间。这种方法没有描述到达目的地时会发生什么,但没有得到足够的颜色。需要一种方法来消除反弹,以完成解决方案。最后,您将(如果可能)有多个标签到达目的地。当第一个标签包含所有颜色(红色、绿色、蓝色)时,您停止算法是在目的地设置的,但不是更早。如果算法停止而没有找到这样的标签,则不可能使用所有三种颜色从s到t。我认为这不是正确的算法。如果我理解正确,这只允许路径更改两次颜色。但是,根据问题,路径是否有效f它至少改变两次颜色。