当前位置: 首页 > 知识库问答 >
问题:

移除最小数量的顶点,使所有顶点隔离

阮才俊
2023-03-14

我有一个无向连通图,我想通过移除顶点而不是边来隔离它的所有顶点,我想保持我移除的顶点数量最小。我知道要实现这一点,我必须每次移除程度最高的顶点,直到图断开。但是我需要为它写一个Java的程序,我不知道如何跟踪程度最高的顶点以及使用哪种数据结构。我得到了以下输入。

{V, E}:分别表示顶点和边的数量。
{A-B}:指定边的顶点对

样本输入:

4 2
1-2
3-4

示例输出:2(这是需要删除的最小数量的顶点,使顶点隔离)

限制条件:

1 <= V <= 10^5
1 <= E <= 3 * 10^5

共有2个答案

上官思博
2023-03-14

我将从以下DS开始:

class Node
{
    int ID;
    int NumberOfNeighbors;
    List<int> NeighborIDs;
}

然后继续将所有节点保持在最大堆中(其中键是numberofneighborients)。

你的算法应该是这样的:

int numberOfDeletedNodes = 0;

While (!heap.Empty)
{
    node = heap.PopTop();
    foreach (int ID in node.NeighborIDs)
    {
        tempNode = heap.Extract(ID);
        tempNode.NumberOfNeighbors--;
        tempNode.NeighborIDs.Remove(node.ID);
        if (tempNode.NumberOfNeighbors != 0)
            heap.Insert(tempNode);
    }

    numberOfDeletedNodes++;   
}

我可能错过了一些终结案例什么的,但总的想法是删除邻居最多的节点,照顾所有的邻居*,并继续进行,直到堆是空的。

* Important: if the neighbors has no more neighbors of its own, it doesn't go back in.
钱照
2023-03-14

我支持贪婪算法在这里并不总是最优的观点,即使任务是隔离顶点,而不是断开图。

这里的问题是顶点覆盖问题,它是NP-hard。

对于一个快速的反例,请考虑从这里获取的此图:

贪婪算法将从根开始,但这将需要4个顶点而不是最佳3个。

 类似资料:
  • 下面的堆栈溢出问题 我尝试了在语句中使用两个重复的多个构造,但无法为每个起始顶点获得独立的。我也在使用平台,因此它限制了Gremlin的使用,其中不允许使用循环/脚本。所有gremlin查询必须以并由与链接在一起的命令组成 https://docs.aws.amazon.com/neptune/latest/userguide/access-graph-gremlin-differences.ht

  • 在OrientDB中移动顶点命令是将一个或多个顶点从当前位置移动到不同的类或群集。 如果您在特定顶点上应用移动命令,则会更新连接到此顶点的所有边。 如果指定一个集群来移动顶点,那么它会将顶点移动到目标集群的服务器所有者。 以下语句是移动顶点()命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 定义想要移动的顶点。 它接受顶点的特定顶点或记录ID数组的记录ID。 - 定义想要移动顶点的位置

  • 删除顶点命令用于从数据库中删除顶点。 在删除时,它会检查并保持与边缘的一致性,并将所有交叉引用(带边)移除到已删除的顶点。 以下语句是删除顶点()命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 使用其类,记录标识或子查询定义要移除的顶点。 - 过滤条件以确定命令删除哪些记录。 - 定义要删除的最大记录数。 — - 定义命令一次删除多少个记录,允许您将大型事务分解为更小的块以节省内存使用

  • 通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。 比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的

  • 在jgrapht中,我添加了一些顶点。 我想知道如何获得所有我添加的顶点或jgrapht中已经存在的顶点? 有办法弄到吗?

  • 我需要为以下问题找到一种“动态编程”的解决方案: 完美二叉树,T=(V,E)-(每个节点只有两个子节点,除了叶子) V=V(蓝色)∪ V(黑色)。V(蓝色)∩ V(黑色)=∅. (换句话说,树中的一些顶点是蓝色的) 树根'r'. 整数k 顶点V'V的子集,它是T的顶点覆盖,并且|V'∩V(蓝色)|=k。(换句话说,覆盖V'包含k个蓝色顶点) 合法解V'的值是集合中的顶点数=|V'|。为了方便起见,