繁体   English   中英

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

[英]Using disjoint-set data structure, graph theory

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

对于具有n个顶点和m个边(小于2×10 6 )的给定无向图,我需要将其顶点分成尽可能多的组,但是有一个条件:来自不同组的每对顶点通过边连接。 每个顶点恰好在一个组中。 最后,我需要知道每个组的大小。

当我提出这个解决方案时,我感到很自豪:考虑原始图的补充图并使用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}。 有连接不同组的每对顶点的边,我们无法创建更多组。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM