Algorithm 如何检查给定的节点集是否是图的顶点割集?

Algorithm 如何检查给定的节点集是否是图的顶点割集?,algorithm,graph,graph-theory,graph-traversal,Algorithm,Graph,Graph Theory,Graph Traversal,我正在寻找有效的算法,以发现删除图中的一组节点是否会将图拆分为多个组件 形式上,给定无向图G=(V,E)和非空集od顶点W⊆ 五、 返回trueiff W为顶点割集。图中没有边权重 到目前为止,我想到的是: 不相交集由W中节点的所有邻居初始化,其中每个集合包含一个这样的邻居 在对V\W的所有节点进行宽度优先遍历期间,对于每个新探索的节点X,以下情况中正好有一种适用: X已与其前身位于同一集合中 X在不相交集中不存在⇒ 添加到与其前身相同的集合中(这两种情况都表示正在进一步探索连接的组件) X

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

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

到目前为止,我想到的是:

  • 不相交集由W中节点的所有邻居初始化,其中每个集合包含一个这样的邻居
  • 在对V\W的所有节点进行宽度优先遍历期间,对于每个新探索的节点X,以下情况中正好有一种适用:
    • X已与其前身位于同一集合中
    • X在不相交集中不存在⇒ 添加到与其前身相同的集合中(这两种情况都表示正在进一步探索连接的组件)
    • X在不同的集合中⇒ 合并不相交集(迄今为止,两个组件看起来是断开的,但实际上是连接的)
  • 每当不相交集仅包含单个集时(甚至在遍历完成之前),结果为
    false
  • 如果遍历完成时不相交的集合包含2个或更多集合,则结果为
    true
时间复杂度为O(| V |+| E |)(假设不相交集的时间复杂度为O(1),而不是更精确的逆阿克曼函数)

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

注意:由于它经常出现在谷歌搜索结果中,我想明确指出,我并没有寻找到目前为止未知的顶点割集的算法,更不用说最优算法了。给定顶点集时,任务只是说是或否

注2:另外,我不搜索边割集验证(我知道,但不能为顶点想出类似的解决方案)

谢谢

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

背后的实际案例是电信网络中断。当某个节点断开连接使整个网络断开连接时,一个组件(包含连接到更高级别网络的节点)仍然正常,需要报告其他所有组件。

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

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

使用
无序集r
存储要删除的顶点集

正常运行DFS,但只转到不在
r
中的相邻项。每次访问未访问的节点时,将访问的节点数增加1

如果到访节点的数量最终小于
|V |-r
,则此集合将分割图形

使用这种方法,您不需要在图形中进行更改,只需忽略
r
中的节点,您可以使用
无序集
在O(1)中进行检查

复杂性与普通DFS相同。

使用
无序集r
存储要删除的顶点集

正常运行DFS,但只转到不在
r
中的相邻项。每次访问未访问的节点时,将访问的节点数增加1

如果到访节点的数量最终小于
|V |-r
,则此集合将分割图形

使用这种方法,您不需要在图形中进行更改,只需忽略
r
中的节点,您可以使用
无序集
在O(1)中进行检查


复杂性与普通DFS相同。

AFAIK,使用DFS我们也会获得O(| V |+| E |)复杂性,不是吗?(DFS也必须遍历所有边。)无论如何,不幸的是,我不得不改变问题,因为我忘了指定另一个要求(我在写问题时就想到了)。好吧,有了DFS,我们也会获得O(| V |+| E |)复杂性,不是吗?(DFS也必须遍历所有边。)无论如何,很遗憾,我不得不更改问题,因为我忘了指定另一个要求(我在写问题时就想到了)。是的,这会起作用,很抱歉我更改了问题。我忘了指定另一个要求(我在写问题时就想到了)。DFS似乎无法用于我的案例。是的,这将起作用,我不得不抱歉我改变了问题。我忘了指定另一个要求(我在写问题时就想到了)。DFS似乎无法用于我的案例。