如何以最少的步骤删除图表?

时间:2015-09-07 01:52:22

标签: algorithm graph computer-science graph-theory theory

给定有向图,如何找到删除最少数量节点以删除整个图所需的顺序?我假设如果一个节点被删除,所有连接到它的外部节点(任何程度)也会被删除。

例如,在二叉搜索树中,删除树中所有节点(给定假设)的最快方法是删除根节点。但是,给定任何图表,如何确定要删除哪些节点?

我的想法(非常慢):

  1. 生成所有可能的子图并找到具有最外边缘的子图。
  2. 删除该子图。
  3. 重复,直到没有剩余的节点。
  4. 为什么这是个好问题: 假设给出了一个有节点的有向图,它代表了世界上所有的问题,所有这些节点都与表示原因/结果的边连接(即一些问题导致其他问题)。为了摆脱所有问题,我们怎样才能找到最少的问题摆脱?

1 个答案:

答案 0 :(得分:1)

顶点可以有:

  1. 仅没有连接边或出站连接边(即路径的第一个顶点);
  2. 仅入站连接边(即路径的最后一个顶点);或
  3. 入站和出站连接边缘 - 在这种情况下它是:
    1. strongly connected component(SCC)的一部分 - 即一个周期a->b->c->a或两个方向都有连接边的顶点a->b->c + c->b->a;或
    2. 有向非循环子图的一部分 - 即b在简单路径a->b->c或一组分支路径中a->b->c + b->d->e + f->b
  4. 可以轻松搜索和删除顶点匹配大小写(1) - 不能通过删除任何其他顶点来删除没有入站边的顶点,因此必须包含在删除图形所需的最小顶点集中。

    可以忽略匹配情况(2)和(3.2)的顶点;删除路径头部的顶点将删除路径中间的所有顶点(情况3.2)和路径末端(情况2),因此这些顶点将永远不会包含在删除所需的最小顶点集合中图表。

    删除SCC中包含的任何顶点(情况3.1)将删除SCC中的所有顶点(以及从SCC分支的所有后代子树)。通过将SCC折叠到单个伪顶点(其中连接到SCC中包含的顶点的所有边缘被认为是以相同的方向性连接到伪顶点),可以(平凡地)减少图形;对所有SCC重复此操作会将图形缩小为连接的有向无环图(DAG)的集合。

    每个DAG将具有一个或多个根顶点(没有出站边),它们将是实例顶点,case(1)或伪顶点,表示case(3.1)。最小删除集是这组根顶点 - 即情况(1)的所有根顶点和每个根伪顶点(表示情况3.1)该SCC中包含的任何一个实际顶点。

    使用Tarjan's Strongly Connected Components Algorithm可以找到严格连接的组件,一旦缩减为DAG,就可以通过计算入站边缘来找到根顶点。

    删除这些顶点的顺序并不重要 - 删除这些顶点中的任何一个都不会删除最小删除集中的任何其他顶点,因此可以按任何顺序删除它们并且必须全部删除才能删除整个图表。 (最小删除集中的顶点可能共享其后代的部分或全部,删除顺序会影响这些后代被删除的顺序,但问题中不会询问。)