Algorithm 给出从图中删除顶点的顺序,使其不会';不要断开图形

Algorithm 给出从图中删除顶点的顺序,使其不会';不要断开图形,algorithm,graph,Algorithm,Graph,这是史蒂文·斯基纳(Steven Skiena)提出的算法设计问题(用于面试准备): 图G的一个连接点是一个顶点,它的删除断开了G。设G是一个有n个顶点和m条边的图。给出一个简单的O(n+m),该O(n+m)可以为n个顶点找到一个删除顺序,这样就没有删除会断开图形 我是这样想的: 在图上运行DFS,并不断更新每个节点最早的可到达祖先(基于此,我们决定它是桥接节点、父节点还是根节点) 如果我们找到一个叶节点(顶点)或一个不是铰接顶点的节点,请删除它 在DFS的末尾,我们将剩下图中所有被发现是连接顶

这是史蒂文·斯基纳(Steven Skiena)提出的算法设计问题(用于面试准备):

图G的一个连接点是一个顶点,它的删除断开了G。设G是一个有n个顶点和m条边的图。给出一个简单的O(n+m),该O(n+m)可以为n个顶点找到一个删除顺序,这样就没有删除会断开图形

我是这样想的:

  • 在图上运行DFS,并不断更新每个节点最早的可到达祖先(基于此,我们决定它是桥接节点、父节点还是根节点)

  • 如果我们找到一个叶节点(顶点)或一个不是铰接顶点的节点,请删除它

  • 在DFS的末尾,我们将剩下图中所有被发现是连接顶点的节点

  • 当铰接顶点完好无损时,图形将保持连接。我已经在几张图上试过了,它似乎很管用,但对这本书来说太简单了

    分两步进行:

  • 使用任何遍历算法生成图形DAG
  • 进行拓扑排序

  • 每一步都不超过O(m+n)

    假设图是连通的,那么任何随机节点都会到达一个子图,该子图的生成树可以按顺序删除,而不会破坏图的连通性。以这种方式重复,直到图形全部消失。

    如果我们总是逐个删除树的叶子,树的其余部分仍保持连接。一种特殊的方法是在使用DFS或BFS遍历图形时为每个顶点指定一个预订单号。按降序对顶点排序(基于预排序编号)。从图中按该顺序删除顶点。请注意,树叶总是先被删除

  • 利用DFS跟踪每个顶点的退出时间
  • 按记录的退出时间顺序删除顶点
    你就不能做一个BFS然后扭转结果吗?删除的节点将始终是叶节点wrt。连接到剩余的BFS树,使图形保持连接。或者,后期DFS也可以工作。只要你有一棵生成树,并且只移除树中的叶子,剩下的图就会保持连接。@哈马尔,你能解释一下后序DFS的想法吗?顶部排序,将从左到右排序节点,或者更确切地说,它给我们一个处理图顶点的顺序,它不关心树的连接。