我刚刚开始学习图形,似乎无法为这个问题提出算法,甚至不知道从哪里开始。我真的很感谢你的帮助!
对于给定的连通图G =(V,E),设计O(n + m)时算法以找到节点v∈V,因此去除v及其所有相邻边缘将不会断开G.
提前谢谢!
答案 0 :(得分:3)
执行广度优先搜索图表。找到的最后一个节点可以在不断开图形的情况下删除。
证明:BFS生成图形的生成树,找到的最后一个节点始终是该树的叶子。删除生成树的叶子不会断开树的连接,并留下剩余顶点的生成树。
答案 1 :(得分:0)
如果符合以下情况,可以删除顶点(不断开图表的其余部分):
在图表上执行深度优先搜索 - 下面是递归DFS算法的一些伪代码:
procedure RecursiveDFS ( u ) {
mark u as visited
u.index = u.lowPoint = ++global_index
if ( ( u is the root and has zero connected edges )
or ( u is not the root and has one connected edge ) ) {
mark u as a leaf
}
for each ( edge e connected to u ) {
if ( e is unvisited ) {
mark e as visited
let e = {u , v}
if ( v is unvisited ) {
mark e as tree edge
RecursiveDFS ( v )
if ( v.lowPoint < u.lowPoint )
{
u.lowPoint = v.index
} else {
mark u as an articulation-point
}
} else {
mark e as cotree edge
if ( v.index < u.lowPoint )
{
u.lowPoint = v.index
}
}
}
}
}
这将访问每个顶点和每个边缘O(m+n)
并将顶点标记为关节点,如果在给定顶点处存在根据该顶点没有共树的DFS的子树(返回) )从连接到给定顶点的祖先的子树发出的边缘。
特殊情况是根顶点(您启动DFS的地方),它将始终标记为清晰点(因为它没有子树连接的祖先) - 而应该检查是否根顶点只有一个相邻的树边和一个或多个相邻的共树(后)边(并且是双连通组件的一部分)。
终止路径的顶点将是: