我正在练习解决空闲时间的编程问题。我前段时间发现这个问题,但仍然不知道如何解决它:
对于给定的具有n个顶点和m个边的无向图(均小于2×10 6 ) 我需要将其顶点分成尽可能多的组,但需要一个 条件:来自不同组的每对顶点通过边连接。 每个顶点恰好在一个组中。最后我需要知道它的大小 每个小组。
当我想出这个解决方案时,我感到很自豪:考虑原始图的complemented graph并使用Disjoint-set数据结构。它给了我们正确的答案(不难证明)。但这只是理论上的解决方案。在给定的约束下,它非常非常糟糕,不是最优的。但我相信这种方法可以巧妙地修复。但是如何?
有人可以帮忙吗?
编辑:对于顶点为1到7和16个边的图:
1 3
1 4
1 5
2 3
3 4
4 5
4 7
4 6
5 6
6 7
2 4
2 7
2 5
3 5
3 7
1 7
我们有3组大小:1,2和4。
这些组分别为:{4},{5,7},{1,2,3,6}。有连接不同组的每对顶点的边缘,我们无法创建更多组。
答案 0 :(得分:0)
我认为你唯一缺少的是如何处理稀疏图。
让我们从找到最大可能的完整图表的角度考虑这一点,我可以做的唯一操作是将一组节点(比如v_1,...,v_k)组合在一起,并将新的超级节点边缘仅提供给那些节点已连接到v_1,...,v_k的所有的u
。
如果图形的边缘数少于n ^ 2/4,则随机采样n
个节点对,注意哪些对未通过边连接。 Union-find是一种简单的编码方式。现在使用此随机采样找到的集合作为组重建图形。递归这个缩小的图表。 (我不太确定如何分析这一步骤,但我相信每个样本重建周期都会将图形大小至少降低一个常数因子,因此整个过程需要接近线性的时间。)
一旦你有一个相当密集的图形(至少n ^ 2/4边缘),你可以转换为邻接矩阵表示并完全按照你的建议 - 检查所有节点对,每当你看到时就做一个联合两个节点没有被边连接,并读取集合。