删除最小数量的顶点以使所有顶点都被隔离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除最小数量的顶点以使所有顶点都被隔离相关的知识,希望对你有一定的参考价值。

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

{V, E}:顶点数和边数。 {A - B}:指定边的顶点对

样本输入:

4 2
1-2
3-4

示例输出:2(这是为了使顶点隔离而需要移除的最小顶点数)

限制:

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

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

这里的问题是Vertex cover问题,它是NP难的。

对于快速反例,请考虑从here获取的此图:

Greedy algorithm does not work

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

另一答案

我将从以下DS开始:

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

然后你继续将所有Nodes保存在最大堆中(其中键是NumberOfNeighbors)。

你的算法应该是这样的:

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++;   
}

我可能错过了一些最终案例或者其他什么,但一般的想法是删除最邻居的节点,照顾所有的neighbor*,并继续前进,直到堆为空。

* Important: if the neighbors has no more neighbors of its own, it doesn't go back in.
另一答案

继续移除具有最高度的顶点并不总是导致移除最少数量的顶点。考虑具有4个顶点v1到v4的完全连通图(因此每个具有度数3)。现在添加两个顶点v5和v6以及三个边(v3,v5),(v4,v5),(v5,v6)。然后移除v5会断开图形,因为v6不再连接到v1到v4,但v5的程度为3,而v4和v3的程度为4。

以上是关于删除最小数量的顶点以使所有顶点都被隔离的主要内容,如果未能解决你的问题,请参考以下文章

最小顶点覆盖

查找 MST 以使特定顶点具有最小度数

关于数据结构的深度优先遍历和广度优先遍历以及最小生成树 第四大题的第一题

怎么求一幅图像的最小生成树

在有向图中找到可以到达其他顶点的最小顶点数[关闭]

片段着色器是不是处理来自顶点着色器的所有像素?