【问题标题】:Creating Strongly Connected Components from a DAG从 DAG 创建强连接组件
【发布时间】:2012-10-01 22:05:39
【问题描述】:

我正在尝试从有向无环图创建强连通分量。

输入是表格中的边列表

1 2
3 5
etc

我需要创建要添加到给定图中的最小边集的出点,以制作强连通分量图......

有什么想法吗?

这是我正在寻找的示例:

给定输入:

1 3
1 4
2 3
2 4
5 7
5 8
6 8
6 9

输出将是添加创建强连通分量所需的最小边数。

输出:

3 1
4 5
7 6
8 1
9 2

【问题讨论】:

  • 不清楚你的意思。每个顶点本身形成一个强连通分量。所以你不必添加任何边缘。但我想你有一个不同的问题?
  • @krjampani 你说的是真的......但是当有一个图表并且它们可能没有连接时,这些成为组件。我正在尝试创建一种算法,可以有效地连接这些未连接的图,使它们成为强连接的组件。
  • 那么你想把每个弱连接的组件都转换成一个强连接的组件吗?如果弱连接组件是 DAG,则可以通过将所有可能的边从汇顶点添加到源顶点来使其成为强连接。这些也很少。
  • @krjampani 这很有意义!我试图将其复杂性降低到线性时间。这可能吗?想法?
  • 你能在图中添加新的顶点以使其强连接吗?最后你想要一个强连接的组件吗?你能提供一个你想要的例子吗?

标签: algorithm graph directed-acyclic-graphs


【解决方案1】:

假设图中没有孤立的顶点,您只需添加 max(|sources|,|sinks|) 边即可使其强连接。

令 T={t1,…,tn} 为汇,{s1,…,s m} 是 DAG 的来源。假设 n i,sj) 当且仅当 ti 可以从 sj.

令 M 为 G(T,S) 中的最大匹配。不失一般性假设 M 由 k 条边组成:{(t1,s1),(t2,s 2),…,(tk,sk)}。在原始图 DAG G 中,添加有向边 {(t1->s2),(t2->s3),…,(tk−1->sk),(tk->s1)}。很容易看出,通过添加这些边,由 M 诱导的顶点在 G 中是强连接的。

现在考虑 G(T,S) 中的剩余顶点。因为 M 最大,所以 S−M 中的每个顶点(分别是 T−M)应该连接到 T 中的一个顶点(分别是 S−M)。所以我们将剩余的顶点任意配对,比如 {(tk+1,sk+1),…,(tn, sn)} 并在 G 中添加相应的有向边。对于每个剩余的源顶点源 si (i 属于 {n+1,…,m} 我们添加G 中的边 (t1->si)。因此添加的边总数为 max(|sources|,|sinks|)。

编辑:添加几个示例

对于您输入中的示例。我们首先计算一个最大匹配,比如:

3--1
4--2
7--5
8--6

所以我们添加边:

3->2
4->5
7->6
8->1

匹配中不存在的剩余(汇)顶点是 9,因此我们将 9 的弧添加到匹配中的任何源顶点,例如 9->1

这是另一个说明算法所有步骤的示例:

输入图:

12 3   5    9 10  (sources)
\|/   /|\    \/
 4   6 7 8   11   (sinks)

最大匹配:

4--1
6--5
11--9

所以我们添加边:

4->5
6->9
11->1

现在剩余的接收器是{7, 8},剩余的源是{2, 3, 10}。我们任意将 7 与 2 和 8 与 3 配对并添加:

7->2
8->3

最后,剩余(源)顶点为 10,我们添加:

4->10

【讨论】:

  • 非常感谢!不过,我无法消化它……您认为您可以使用我的示例数据逐步完成吗?我目前正在这样做,但我并不完全在那里。我真的很感激。
  • 不客气。添加了几个示例。希望他们说得更清楚。
  • 点赞一百万次!但是,我确实有几个更明确的问题......首先,你能解释更多关于最大匹配的信息吗?以及如何识别它?其次,我计算了 7 条边被添加到您的示例中。根据添加顶点的最小数量应该是 MAX(source,sink) 因为 source = 5 和 sink = 5 的假设,不应该只有 5 个吗?
  • *添加的边数(不是顶点)
  • 你是对的。第二个例子有一个小问题。现在修好了。但请注意,源数为 6,因此需要添加 6 条边。
【解决方案2】:

如果我正确理解了您的问题,您应该使用图形的邻接矩阵表示。最初,它将是一个稀疏矩阵,其中包含 1 或您当前边缘所在的位置。

使用矩阵的简单遍历,创建 SCC 所需的所有 0 元素 -> 1,并且这些转换中的每一个都将是您需要添加的边。

还有一个很好的 wiki 页面显示了可能用于此的流行算法:

http://en.wikipedia.org/wiki/Strongly_connected_component

推荐Tarjan'sPath-based算法是最实用的。

【讨论】:

  • 我刚刚阅读了算法并有两个后续问题。 1. 从我的阅读来看,这些算法似乎是用来识别强连接的组件,而不是为了找到需要添加哪些边才能创建它们,所以我不确定如何实现它。和 2. 如果我使用邻接矩阵表示并简单地将所有 0 元素设为 1 以创建新边,我最终会得到一个完全连通的图,不是吗?不是为创建强连通分量而添加的最小边数
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多