算法:非铰接顶点
Algorithm: non-Articulation vertex
图G的连接顶点是其删除的顶点设G是一个有n个顶点和m条边的图。给一个求G的一个非顶点的简单O(n+m(算法关节顶点——即其删除不会断开G.
设初始顶点数为n,则在去除一个顶点后,我们应该有n-1条边。我使用dfs遍历图并计算顶点的数量。如果计数小于n-1,它就是一个关节顶点,所以我把它加回来。否则就不是了,我增加了一个计数器。
有什么更好的方法来找到非关节顶点,因为这个方法很慢,我需要O(n+m(。
使用DFS(深度优先搜索(是一个很好的开始方式,因为它本身已经是一个O(V+E(。因此,我们的想法是遍历一次图,然后能够计算出它的属性。旁注:无论何时执行图形算法,都要思考循环!
证明关节顶点合理的条件(在DFS的思维方式下(:
-
根节点是一个关节点iff它有多个子
-
Leaf从来都不是一个关节点
-
非叶、非根节点
u
是一个关节点iff没有非树边缘从u
的某个子树下的子树到达u
之上
这涵盖了所有情况:根节点、叶子和介于两者之间的任何其他节点。
对于非关节顶点,我们只需要找到证明相反的条件:
- 根节点是非关节点iff它有一个子节点
- 叶始终是一个非铰接点
-
非叶、非根节点
u
是一个非关节点iff有一个非树边从u
的某个子树下的子树延伸到u
之上
数字3可以读作:如果节点u
在两个分裂的树之间有另一个连接,也就是一个循环。
以下是一些关节顶点代码。您可能需要对其进行调整。
相关文章:
- 如何循环打印顶点结构
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 在现有数据结构上使用BGL算法需要什么(边和顶点作为矢量<对象*>)?
- 控制两个顶点之间的中间点数量 - 布雷森汉姆算法的扩展
- Dijkstra算法找到两个顶点之间的最短距离 c++
- 如何使用boost::graph dijkstra的算法,如果顶点属性是指针?
- 如何使用boost::graph算法与listS,setS作为顶点/边缘容器
- 点在顶点定义盒算法
- 算法:非铰接顶点
- 寻找遍历图中所有顶点的路径的更好算法是什么?