Algorithm 如何检查给定的节点集是否是图的顶点割集?
我正在寻找有效的算法,以发现删除图中的一组节点是否会将图拆分为多个组件 形式上,给定无向图G=(V,E)和非空集od顶点W⊆ 五、 返回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
true
iff W为顶点割集。图中没有边权重
到目前为止,我想到的是:
- 不相交集由W中节点的所有邻居初始化,其中每个集合包含一个这样的邻居李>
- 在对V\W的所有节点进行宽度优先遍历期间,对于每个新探索的节点X,以下情况中正好有一种适用:
- X已与其前身位于同一集合中
- X在不相交集中不存在⇒ 添加到与其前身相同的集合中(这两种情况都表示正在进一步探索连接的组件)
- X在不同的集合中⇒ 合并不相交集(迄今为止,两个组件看起来是断开的,但实际上是连接的)
- 每当不相交集仅包含单个集时(甚至在遍历完成之前),结果为
false
- 如果遍历完成时不相交的集合包含2个或更多集合,则结果为
true
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似乎无法用于我的案例。