时间:2017-02-12 22:00:41

标签: algorithm graph-theory

我刚刚开始学习图形,似乎无法为这个问题提出算法,甚至不知道从哪里开始。我真的很感谢你的帮助!

对于给定的连通图G =(V,E),设计O(n + m)时算法以找到节点v∈V,因此去除v及其所有相邻边缘将不会断开G.

提前谢谢!

2 个答案:

答案 0 :(得分:3)

执行广度优先搜索图表。找到的最后一个节点可以在不断开图形的情况下删除。

证明:BFS生成图形的生成树,找到的最后一个节点始终是该树的叶子。删除生成树的叶子不会断开树的连接,并留下剩余顶点的生成树。

答案 1 :(得分:0)

如果符合以下情况,可以删除顶点(不断开图表的其余部分):

  1. 这不是一个发音点;或
  2. 它终止图中的路径,该路径仅在一端连接;或
  3. 它是图表中唯一的顶点。
  4. 有关识别关节点的算法,请参阅Hopcroft, J.; Tarjan, R. (1973). "Algorithm 447: efficient algorithms for graph manipulation". Communications of the ACM. 16 (6): 372–378

    在图表上执行深度优先搜索 - 下面是递归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的地方),它将始终标记为清晰点(因为它没有子树连接的祖先) - 而应该检查是否根顶点只有一个相邻的树边和一个或多个相邻的共树(后)边(并且是双连通组件的一部分)。

    终止路径的顶点将是:

    1. DFS树的叶顶点(只有一个连接的树边,来自DFS树内的父树,以及零连接的共树边);或
    2. DFS树的根顶点一个相邻的树边缘和零相邻的共树(后)边缘。