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

Algorithm 如何以最少的步骤删除图形?,algorithm,graph,computer-science,graph-theory,theory,Algorithm,Graph,Computer Science,Graph Theory,Theory,给定一个有向图,如何找到删除最小数量的节点以删除整个图所需的顺序?我假设如果一个节点被删除,所有连接到它的外部节点(任何程度)也会被删除 例如,在二叉搜索树中,删除树中所有节点的最快方法(假设)是删除根节点。然而,给定任何一个图,如何确定要删除哪些节点 我的想法(相当缓慢): 生成所有可能的子图,并找到最外边的子图 删除那个子图 重复此操作,直到不再有剩余节点 为什么这是个好问题: 假设我们得到一个有向图,其中的节点表示世界上所有的问题,所有这些节点都与表示原因/影响(即,一些问题导致其他问题)

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

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

我的想法(相当缓慢):

  • 生成所有可能的子图,并找到最外边的子图
  • 删除那个子图
  • 重复此操作,直到不再有剩余节点
  • 为什么这是个好问题:
    假设我们得到一个有向图,其中的节点表示世界上所有的问题,所有这些节点都与表示原因/影响(即,一些问题导致其他问题)的边相连。我们怎样才能找到最少的问题来解决,从而解决所有的问题

    一个顶点可以有:

  • 无连接边或仅出站连接边(即路径的第一个顶点)
  • 仅限入站连接边(即路径的最后一个顶点);或
  • 入站和出站连接边-在这种情况下,它是:
  • a(SCC)的一部分-即循环
    a->b->c->a
    或在两个方向上具有连接边的顶点
    a->b->c+c->b->a
    ;或
  • 有向无环子图的一部分,即在一个简单路径
    a->b->c
    或一组分支路径
    a->b->c+b->d->e+f->b
    中的
    b
  • 匹配案例(1)的顶点可以简单地搜索和删除-没有入站边的顶点不能通过删除任何其他顶点来删除,因此必须包含在删除图所需的最小顶点集内

    顶点匹配情况(2)和(3.2)可以忽略;删除路径头上的顶点将删除路径中间(情况3.2)和路径末端(案例2)中的所有顶点,因此这些顶点将永远不包含在删除图所需的最小顶点集合中。 删除SCC中包含的任何顶点(情况3.1)将删除SCC中的所有顶点(以及从SCC分支的所有后代子树)。可通过将SCC折叠为单个伪顶点(其中连接到SCC中包含的顶点的所有边被视为以相同方向性连接到伪顶点)来(简单地)缩减图;对所有SCC重复此操作将使图简化为一组连接的有向无环图(DAG)

    每个DAG将有一个或多个根顶点(没有出站边),这些根顶点将是实际顶点(案例(1))或伪顶点(案例(3.1))。最小删除集是这组根顶点,即情况(1)的所有根顶点以及每个根伪顶点(代表情况3.1)包含在该SCC中的任何一个实际顶点

    可以使用查找Stronly连接的组件,并且一旦减少到DAG,就可以通过计算入站边来查找根顶点


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

    欢迎使用stackoverflow。从问题的复制/粘贴性质可以很明显地看出,这是一个作业问题。我们不介意帮助他们,但目前的格式是“为我做”,我们不是来这里做的。如果是的话,我们最终会拿到学位。用一些你尝试过的例子来更新你的问题,如果可以,我们会帮助你。我已经为这个问题添加了我的答案,但我不得不承认这是一个相当慢的算法。另外,请记住,这不是一个作业问题。我只是想知道是否有人能想出一个更好的方法来解决这个问题。好得多。现在您将收到一个不错的响应。因此,如果您删除一个节点,您将删除它指向的每个节点,以及这些节点指向的每个节点,依此类推。而且,它是一个图形而不是一棵树。考虑到这一点,你什么时候可以说,“删除那个节点比删除这个节点更好,因为如果我删除那个节点,我会同时删除两个节点,可能还有其他节点?”你需要计算出从图的每个节点可以到达多少个节点。为此,需要从每个节点开始执行图遍历(bfs/dfs)。找到具有最大可达节点数的起始节点后,删除该节点及其所有“可达”节点,然后重复该过程,直到没有剩余节点