算法:最小路径交替颜色

时间:2019-03-05 02:31:20

标签: algorithm graph

让G是一个有向加权图,其中节点的颜色为黑色或白色,并且所有权重均为非负数。没有指定其他信息-没有起点或终点。

我需要找到一条最小重量的路径(不一定简单),该路径至少交替n次颜色。我的第一个想法是运行Kosaraju的算法来获取组件图,然后找到组件之间的最小路径。然后,您可以选择in-degree等于零的节点,因为这些节点至少具有与以in-degree为正的分量开始的路径一样多的颜色交替。但是,这也意味着您的路径可能不必要地长。

我已经考虑过尝试通过修改黑白边缘或黑白边缘指向的图形副本或复制或删除边缘来尝试修改图形,但是我没有做任何事情头脑风暴似乎奏效了。

1 个答案:

答案 0 :(得分:1)

评论提到使用Dijkstra算法,实际上有一种方法可以使这项工作生效。如果我们在图中创建一个新的“根”顶点,并使用有向边将每个其他顶点连接到该顶点,则可以从根向外运行修改的Dijkstra算法,并在给定路径的倒数超过n时终止。重要的是要注意,我们必须允许重新访问实现中的每个顶点,因此优先级队列中每个顶点的键将不仅是node_id,而是一个元组(node_id, inversion_count),代表其顶点在其上第i次访问。这样,我们隐式地为每个顶点制作n个副本,每次潜在访问都一个。在视觉上,我们有效地制作了n个图形的副本,并平移了每个(black_vertex, white_vertex)对之间的边以在第i和第i+1个反转图中进行连接。我们运行算法,直到到达具有n倒置的路径。或者,我们可以将第n个反转图中的每个顶点连接到“汇”顶点,并在该图中运行任何未经修改的常规路径查找算法。这将在O(n(E + Vlog(nV)))时间运行。您可以对此进行大量优化,也可以考虑使用A *,将smallest_inversion_weight * (n - inversion_count)用作启发式算法。

此外,关于使用反演要求的知识加快搜索速度的另一个想法使我大吃一惊,但是我无法找到一种方法来实现它,而不会超过O(V^2)时间。这个想法是,您可以使用加法链(例如二进制幂运算)将最短的n反转路径分解为两个较小的路径,然后以分而治之的方式冲洗和重复。问题是,您将需要根据任意两个顶点的最短i反转路径构造表,这将是每个O(V^2)的{​​{1}}个条目,以及总共i个。要构造每个表,对于上一个表中的每个条目,您都需要追加O(V^2logn)条其他路径,因此总共需要V时间。也许其他人会看到一种将这两个想法合并到O(V^3logn)时间算法之内的方法。