【问题标题】:Strongly Connected Component with constraint带约束的强连通分量
【发布时间】:2015-11-12 16:32:00
【问题描述】:

我遇到了一个类似这样的问题。

我们得到一个无向图,其中每条边都有一个值。现在额外的限制是不能从较高价值的边缘移动到较低价值的边缘。一个人总是必须从低价值转向高价值。

问题可以描述为

                                   1
                               1 /   \ 1
                                /     \
                               3       7
                            2 / \  3   
                             /   \
                            4     5

所以这里我们可以从 7 -> 1 -> 3 -> 4 移动,但不能从 4 -> 3 -> 1 移动。所以在这张图中,我们被要求找出强连通分量,例如 (1, 3, 7 ) 在这里。


我已经尝试过使用 Kosaraju 算法和这样的约束。

for v in adj[u]:
    if not visited[v] and v.edgeValue >= u.edgeValue:
        do work here

但我认为逻辑是错误的,我无法找出它失败的地方。 有人可以指出错误并显示某种伪代码吗?

谢谢。

【问题讨论】:

  • 我们可以分别去 4->3 和 3->1,对吧?如果是这样,我不清楚“强组件”是什么意思。
  • 如果我没记错的话,你问的是如何找到所有节点都可以到达组件内任何其他节点的所有强连接组件,这意味着组件中的所有边都具有相同的权重,并且我们该怎么做,对吧?

标签: algorithm graph-theory strongly-connected-graph


【解决方案1】:

好吧,在您的限制下,您允许的方向取决于您的旅行历史。这使得连接的组件有一点不同的含义。我假设强连通分量是指对于来自任何顶点的子图,可以到达该子图的任何其他顶点。由于您的约束指定您不能从较低值的边移动到较高的值,这意味着任何强连接的子图都包含具有相等加权边的树。

因此,在上面的示例中,您将 (4,3)(3,5)(3,1,7) 作为图的一个特定分区,划分为强分量。你可以通过做一个简单的 DFS 或 BFS 来获得这些,同时只包括特定权重的边缘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多