彩色边图中的最短路径

Posted

技术标签:

【中文标题】彩色边图中的最短路径【英文标题】:shortest path in colored-edge graph 【发布时间】:2011-07-19 06:13:28 【问题描述】:

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

我尝试使用 BFS,但找不到解决方案。 关于如何开始的任何想法?

【问题讨论】:

【参考方案1】:

我将使用 BFS,并从每个节点开始,计算从该节点可发现的第一个有效路径,保存该值,然后继续下一个。

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

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

【讨论】:

在最坏的情况下不会需要很长的运行时间吗? 好吧,所有对的最短路径通常是 n^3,因此您的解决方案可能会有相当长的运行时间。一旦确定了可行的解决方案,您应该能够弄清楚如何节省运行时间。【参考方案2】:

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

使用广义 Dijkstra 求最短路径: 每个节点都有一个标签列表,一个标签由开始节点的长度和尚未访问的所有颜色组成。 如果 (1) 它的长度较短 并且 (2) 它包含另一个标签的所有颜色,则一个标签在该节点中优于另一个标签。被支配的标签被直接删除。 与 dijkstra 类似,您维护一个优先级队列,您始终可以从该队列中放松长度较短的节点。对节点 v 取一条边会将标签的长度增加 endge 长度,并将边的颜色添加到标签中。标签被添加到节点 v 的标签列表中。 当使用包含所有三种颜色的标签来设置目标节点时,您已经找到了最短路径。 请注意,如果要在最后重建最短路径,则必须为每个标签保存前驱节点。

您从带​​有 (0,)(零长度且无颜色)的起始节点处的初始标签开始。

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

【讨论】:

这种方法没有描述当它到达目的地但没有得到足够的颜色时会发生什么。需要一种反冲的方法来完善解决方案。 最后,您将(如果可能)有多个标签到达目的地。当包含所有颜色(红色、绿色、蓝色)的第一个标签在目的地解决时,您停止算法,但不会更早。如果算法在没有找到这样的标签的情况下停止,则不可能使用所有三种颜色从 s 到 t。【参考方案3】:

创建一个新图形(6 次)由原始图形的三个副本组成,第一个仅包含一种颜色的边,第二个包含另一种颜色的边,并将它们与来自第二种颜色,第三个副本将具有所有边,并通过第三种颜色的边连接到第二个图。 然后运行 ​​dijkstra 找到从 s1 到 t3 的最短路径。 因为我们不知道顺序是什么,所以我们将对全部 6 种可能的颜色顺序做同样的事情,然后选择我们得到的 6 条最短路径中最短的一条。

【讨论】:

我认为这不是正确的算法。如果我理解正确,这只允许路径恰好改变颜色两次。但是,根据问题,如果路径至少两次更改颜色,则路径是有效的。【参考方案4】:

确实存在如下简单的解决方案。

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

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

由于您已经拥有正常的 dijkstra 数据,一旦您完成此操作,您将在恒定时间内得到结果,最小化所有猜测。

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

我同意最终复杂度 O(nm^3) 通常太大,但有时微不足道的算法可以工作。

【讨论】:

【参考方案5】:

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

那么新图中从 (s, ∅) 到 (t, red, green, blue) 的最短路径对应于从 s 到 t。由于新图中只有线性更多的顶点和边(假设颜色集是固定的),所以这个问题可以像普通的最短路径问题一样快速渐近解决。

作为一个实现细节,请注意实际上没有必要在内存中写下整个产品图。顶点和边可以在运行最短路径算法时动态生成,允许完全跳过未使用的顶点。

这种方法与eci's answer 略有不同,它扩展了顶点标签而不是路径权重。

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

【讨论】:

以上是关于彩色边图中的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

到给定顶点的所有最短路径

CF567E President and Roads

访问k个顶点的无向图中的最短路径

去除最少边以强制增加未加权无向图中最短路径长度的算法

贪心算法-图的最短路径算法Dijkstra之证明