我正在寻找一种算法。假设我们有一个顶点为{A,B,C,D,E ...}的图,并且每个顶点在集合中的其他顶点可能具有多个加权边(我将组成一个邻接表作为示例):< / p>
A: (B, 34), (C, 32), (E, 20)
B: (A, 30)
C: (C, 32), (D, 41)
D: (B, 34), (A, 30), (E, 20)
E: (D, 41)
到同一节点的边总是具有相同的值。
我想找到边缘权重总和最大的子集(某个固定长度),其中节点的边缘仅被计数一次。换句话说,在此示例中,长度2的最大子集是{C,D},其值是30 + 34 + 32 + 41 + 20 = 157(它将达到所有值)。尽管具有最大的单个值,但A不包括在此总和中,并且将其与任何其他节点求和不会得出所有值。
为清楚起见,{C,E}的子集为32 + 41 = 73(D的边没有计算两次)。
通过暴力进行此操作类似于O(V!* lg(V)),这是因为在末尾找到了组合和排序。有什么方法可以更有效地计算出来吗?
答案 0 :(得分:0)
我想我会说出到目前为止我已经弄清楚的事情。我没有想出任何更好的最坏情况的保证,但是我想出了一个修剪启发法,可以保证找到最佳解决方案。假设存在名为x和y的集合,每个集合的大小均为n(不过x也可以小于y)。如果y是x的子集,则可以保证用y替换x的任何集合至少与使用y的集合一样好。检查最坏情况的二次方时间将检查任何集合是否为超集,但是如果期望顶点相似(或在合并后相似),则可能导致计算时间减少。