完整图中的路径

时间:2009-08-24 16:44:56

标签: algorithm math graph-theory combinatorics discrete-mathematics

我有一位朋友需要计算以下内容:

在完整图Kn(k <= 13)中,存在k *(k-1)/ 2个边。 每个边缘可以以两种方式定向,因此2 ^ [(k *(k-1))/ 2]个不同的情况。

她需要计算P[A !-> B && C !-> D] - P[A !-> B]*P[C !-> D]

X! - &gt; Y表示“没有从X到Y的路径”,P []是概率。

因此,强力算法是检查2 ^ [(k *(k-1))/ 2]个不同图形中的每一个,并且由于它们是完整的,因此在每个图形中只需要考虑一组A ,B,C,D因为对称性。

P [A! - >然后将B]计算为“节点1和2之间没有路径的图的数量”除以图的总数,即2 ^ [(k *(k-1))/ 2]。

bruteforce方法在mathematica中适用于K8,但她需要K9,K10 ......直到K13。

我们显然不需要在案例中找到最短路径,只想查找是否存在。

有人有优化建议吗? (这听起来像典型的Project Euler问题。)

示例:

最小图K4有4个顶点,给出6个边。因此,如果我们标记4个顶点A,B,C和D,则有2 ^ 6 = 64种可能的方式为边指定方向。

在某些图表中,没有从A到B的路径(假设是X的路径),而在其他一些路径中,没有从C到D的路径(假设为Y)。但在某些图表中,没有从A到B的路径,同时没有从C到D的路径。这些是W。

所以P[A !-> B]=X/64P[C !-> D]=Y/64P[A !-> B && C !-> D] = W/64

更新

  • A,B,C和D是4个不同的转角,因此我们至少需要K4。
  • 注意我们正在处理DIRECTED图,因此使用UT矩阵的正常表示是不够的。
  • mathematica中有一个函数可以找到有向图中节点之间的距离(如果它返回无穷大,没有路径),但这有点矫枉过正,因为我们不需要距离,就好像有路径与否。

3 个答案:

答案 0 :(得分:4)

我有一个理论,但我没有mathematica来测试它,所以这里。 (请原谅我在术语上的错误,我并不熟悉图论。)

我同意有2 ^(n *(n-1)/ 2)个不同的有向Kn图。问题是其中有多少包含路径A-> B。拨打该号码S(n)。

假设我们知道某些n的S(n),我们想要添加另一个节点X,并计算S(n + 1)。我们将寻找路径X-> A。

有两种方法可以将X连接到预先存在的图形。

边缘X-A可能指向“右”方向(X-> A);这种方式有2 ^(n-1)种方式连接X,它将导致任何2 ^(n *(n-1)/ 2)个不同Kn图的路径。

如果X-A指向X,请尝试边缘X-B。如果X-B指向B(并且有2 ^(n-2)个这样的方式来连接X)那么一些Kn图实际上将给出它们的路径B-> A,S(n)。

如果X-B指向X,请尝试X-C;那里有2 ^(n-3)个S(n)成功图。

如果我的数学是正确的,S(n + 1)= 2 ^((n + 2)(n-1)/ 2)+(2 ^(n-1)-1)S(n)

所以这给出了以下内容:

S(2) = 1
S(3) = 5
S(4) = 47
S(5) = 841
S(6) = 28999

有人可以检查一下吗?或者给S(n)一个封闭的表格?

修改:
我现在看到困难的部分是这个P [A! - &gt; B&amp;&amp; C! - &gt; d。但我认为递归方法仍然有效:从{A,B,C,D}开始,然后继续添加点,跟踪A->(a点),(b点)的图形数量 - &gt; B,C->(c点)和(d点) - > D,保持期望的约束。丑陋但易于处理。

答案 1 :(得分:2)

考虑所有图表的蛮力方法不会让你更进一步,你将不得不一次考虑多个图表。

对于8,你有2 ^ 28~256万个图表。

9:2 ^ 36~64亿

10:2 ^ 45~32万亿

11:2 ^ 55&gt; 10 16

12:2 ^ 66&gt; 10 19

13:2 ^ 78&gt; 10 23

为了找到路径,有趣的部分是图的强连通分量的部分排序。实际上,排序必须是完全的,因为任何两个节点之间都存在边缘。

所以你可以尝试考虑总排序,肯定比图表少得多。

答案 2 :(得分:0)

我认为使用矩阵表示图形将非常有用。

如果 A!->B 0 放在第A行和第B列。

在其他地方加上 1

0的计数= Z

然后P[A!->B] = 1 / 2^Z

=&GT; P[A!->B && C!->B] - P[A!-B].P[C!-D] = 1/2^2 - 1/ 2^(X-2) //这里有错误我正在修理它 where X = k(k-1)/2

  A B C D
A . 0 1 1
B . . 1 1
C . . . 1
D . . . .

注意:我们可以使用上三角而不失一般性。