【问题标题】:Find a path from vertex s to vertex t with minimal number of color alternates找到一条从顶点 s 到顶点 t 的路径,其中颜色交替最少
【发布时间】:2020-11-01 22:34:44
【问题描述】:

是有向图,让 是红色和蓝色的边缘着色。让 s,t 是 G 中的顶点。找到一条从 s 到 t(如果存在)的路径,使得沿着这条路径的颜色变化次数最少。

我尝试过如下操作:

  1. 为去掉所有 G 的蓝色边。设 为得到的图 通过去除所有红色的 G。
  2. strongly connected 图,计算 使用this 算法。
  3. 成为 strongly connected 的图,使用计算 this算法。
  4. 为顶点着色 为红色,并为顶点着色 蓝色。
  5. 成为 将与合并得到的图形
  6. 定义每个(现有)的重量 G' 中的边为 0。
  7. 对于每个,这样你 属于强连通分量和v 属于强连通分量 do as 如下:
  • 如果 将边 添加到 G' 和 将其权重定义为 1。
  1. 使用 Dijkstra 算法找到最短的 从 s 的蓝色强连通分量到两者的路径 t 的蓝色和红色强连通分量。
  2. 使用 Dijkstra 从红色强连接中找到最短路径的算法 s 的分量,与蓝色和红色都强连接 t 的组成部分。
  3. 令 p 表示四个我们之间的最短路径 刚刚发现。 (即,p 具有最少数量的颜色替代)。 p 是一系列强连通分量。 使用 DFS 展开它们中的每一个,以在 G 中找到对应的路径。

这个算法可以在 O(E+V*log(v)) 中运行。可以改进或简化吗?

【问题讨论】:

    标签: graph depth-first-search dijkstra graph-coloring strongly-connected-graph


    【解决方案1】:

    我不完全理解您的算法,特别是在第 4 阶段,您将使用两种不同颜色的边缘为每个顶点着色 - 蓝色和红色...
    因此,我不会尝试改进您的算法,但会提出我自己的一个 - BFS 的变体,时间为 O(E + V)。

    想法:遍历图形的边缘并测量深度作为您切换颜色的次数。

    注意:我们将运行算法两次,首先假设路径的第一条边是红色的,第二次假设路径的第一条边是蓝色的,然后取最小值。

    1. 仅在从 s(这是 BFS 队列中的第一个元素)开始的红色边上运行 BFS,如果您在蓝色边上查看顶点,请将其放在不同的队列中。
    2. 用数字i(开头为i=0)标记您看到的所有节点。
    3. 将蓝色边缘的队列设为主要队列。
    4. 运行阶段 1 到 3,但切换颜色并将 1 添加到 i

    最后,t 中的数字是为达到t 而执行的最小交换次数。

    【讨论】:

    • 谢谢,这显然比我的(确实很复杂)算法更简单、更高效:)
    猜你喜欢
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多