删除最小数量的顶点以使所有顶点都被隔离
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获取的此图:
贪婪的算法将从根开始,但这将需要4个顶点而不是最优3。
另一答案
我将从以下DS开始:
class Node
{
int ID;
int NumberOfNeighbors;
List<int> NeighborIDs;
}
然后你继续将所有Node
s保存在最大堆中(其中键是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。
以上是关于删除最小数量的顶点以使所有顶点都被隔离的主要内容,如果未能解决你的问题,请参考以下文章