使用不相交集数据结构,图论

时间:2012-12-29 13:03:06

标签: algorithm data-structures graph graph-algorithm

我正在练习解决空闲时间的编程问题。我前段时间发现这个问题,但仍然不知道如何解决它:

  

对于给定的具有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}。有连接不同组的每对顶点的边缘,我们无法创建更多组。

1 个答案:

答案 0 :(得分:0)

我认为你唯一缺少的是如何处理稀疏图。

让我们从找到最大可能的完整图表的角度考虑这一点,我可以做的唯一操作是将一组节点(比如v_1,...,v_k)组合在一起,并将新的超级节点边缘仅提供给那些节点已连接到v_1,...,v_k的所有u

如果图形的边缘数少于n ^ 2/4,则随机采样n个节点对,注意哪些对未通过边连接。 Union-find是一种简单的编码方式。现在使用此随机采样找到的集合作为组重建图形。递归这个缩小的图表。 (我不太确定如何分析这一步骤,但我相信每个样本重建周期都会将图形大小至少降低一个常数因子,因此整个过程需要接近线性的时间。)

一旦你有一个相当密集的图形(至少n ^ 2/4边缘),你可以转换为邻接矩阵表示并完全按照你的建议 - 检查所有节点对,每当你看到时就做一个联合两个节点没有被边连接,并读取集合。