【发布时间】: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