【问题标题】:Using disjoint-set data structure, graph theory使用不相交集数据结构,图论
【发布时间】:2012-12-14 10:53:34
【问题描述】:

我在空闲时间练习解决编程问题。这个问题我前段时间发现了,现在还不知道怎么解决:

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

当我想出这个解决方案时,我很自豪:考虑原始图的complemented graph 并为其使用不相交集数据结构。它给了我们正确的答案(不难证明)。但这只是理论上的解决方案。在给定的约束下,它非常非常糟糕,不是最优的。但我相信这种方法可以以某种方式巧妙地解决。但是怎么做呢?

谁能帮忙?

编辑:对于顶点从 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}。有边连接来自不同组的每对顶点,我们无法创建更多组。

【问题讨论】:

  • 当您说each pair of vertices from different groups are connected by edge 时,您的意思是它们最多通过一个边缘连接吗?如果不是,来自不同组的每对顶点必须有一条边,你的意思是如果你有组A{a, b}, B{c, d}那么必须有从acd的边,以及从@987654327 @ 到 cd?
  • 来自不同组的每一对顶点由一条边连接。如果我们有你所说的组 A{a,b} 和 B{c,d},那么它们是组,如果存在边 a-c,a-d,b-c,b-d;我们必须创建尽可能多的组,所以如果不存在边 a-b 或 c-d,那么我们可以将 A 或 B 分成两组。
  • 在最后一句中,您的意思是如果不存在边a-ca-d,对吗?还是同一组中的顶点之间必须有边?
  • 对不起,我弄错了。我编辑了我的问题并举了一个例子来说明一切。
  • 您确定您发布的结果吗?还是我误解了问题所在?

标签: algorithm data-structures graph graph-algorithm


【解决方案1】:

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

让我们从寻找最大可能的完整图的角度来考虑这个问题,其中我唯一能做的就是将一组节点(比如 v_1、...、v_k)组合在一起,并将新的超级节点边仅提供给这些节点u 已连接到 v_1、...、v_k 的所有

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多