【问题标题】:How to check if given set of nodes is the vertex cut set of the graph?如何检查给定的节点集是否是图的顶点割集?
【发布时间】:2020-04-27 22:51:00
【问题描述】:

我正在寻找有效的算法来发现删除图中的一组节点是否会将图拆分为多个组件。

形式上,给定无向图 G = (V,E) 和非空集合 od 顶点 W ⊆ V,返回 trueiff W 是顶点割集。图中没有边权重。

到目前为止,我想到的是使用disjoint set

  • 不相交集使用 W 中节点的所有邻居进行初始化,其中每个集合都包含一个这样的邻居。
  • V\W的所有节点的广度优先遍历过程中,对于每个新探索的节点X,以下情况中恰好存在一种:
    • X 已经和它的前身在同一个集合中
    • X 在不相交集合中不存在 ⇒ 被添加到与其前任相同的集合中(这两种情况都意味着正在进一步探索连接的组件)
    • X 在不同的集合中⇒ 合并不相交的集合(两个组件到目前为止看起来是断开的,但结果是连接的)
  • 只要不相交集仅包含单个集(甚至在遍历完成之前),结果就是false
  • 如果不相交集在遍历完成时包含2个或更多集,则结果为true

时间复杂度为O(|V|+|E|)(假设不相交集的时间复杂度为O(1),而不是更精确的反阿克曼函数) .

您知道更好的解决方案(或发现建议中的任何缺陷)吗?

注意:由于它经常出现在 Google 搜索结果中,我想明确声明我不是在寻找算法来找到迄今为止未知的顶点割集,更不用说最优了。给定顶点集,任务就是说是或否。

注意 2:另外,我不搜索边割集验证(我知道 Find cut set in a graph,但无法为顶点想出类似的解决方案)。

谢谢!

更新:我发现在true 结果的情况下,我还需要层次结构中断开组件中的节点数据,具体取决于与已删除节点的距离。因此选择了 BFS。我为后期编辑道歉。

背后的实际案例是电信网络中断。当某个节点坏了导致整个网络断开时,一个组件(包含与更高级别网络连接的节点)仍然可以,其他所有组件都需要报告。

【问题讨论】:

    标签: algorithm graph graph-theory graph-traversal


    【解决方案1】:

    有一个unordered_set<int> r 来存储您要删除的顶点集。

    正常运行 DFS,但只转到不在r 中的相邻节点。总是访问未访问的节点,将访问的节点数加 1。

    如果最后访问的节点数小于|V| - r,这个集合划分图。

    使用这种方法,您无需在图表中进行更改,只需忽略 r 中的节点,您可以使用 unordered_set<int> 签入 O(1)。

    复杂度与普通 DFS 相同。

    【讨论】:

    • 是的,这行得通,我很抱歉我改变了问题。我忘了指定另一个要求(我在写问题时就想到了)。 DFS 似乎不适用于我的情况。
    【解决方案2】:

    你不能通过在图上执行深度优先搜索来获得 O(|V|) 复杂度吗?从 V 中消除集合 W 并执行 DFS。记录处理的节点数,当您无法到达更多节点时停止。如果处理的节点数小于|V| - |W|,则 W 是割集。

    【讨论】:

    • AFAIK,使用 DFS 我们也可以获得 O(|V|+|E|) 复杂度,不是吗? (DFS 也必须遍历所有边。)无论如何,不​​幸的是我不得不更改问题,因为我忘记指定另一个要求(我在写问题时就想到了。)
    猜你喜欢
    • 2022-07-25
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多