我想我可以帮助你。
您的问题可以很容易地转换为最长路径问题。找到一条长度为 k 的路径真的很难解决很长时间。即使 k 相对较小,例如 log (n),人们仍然认为这在多项式时间内是不可能的。
基本思想:您多次为图着色,并希望您不小心为长度为 k 的路径着色。嗯,这个概率很小,但是如果你重复很多次,这个概率实际上会变得很大。
但首先,让我们假设图中有一条彩色路径。 “有色”是什么意思?彩色表示长度为 k-1 的路径有 k 个节点,用 k 种不同的颜色着色。如果你从一个颜色为 1 的节点 v 开始,你会怎么做?
你会看看你的邻居,看看他们的颜色是否与你不同。如果有,则将它们添加到一个名为 P(1) 的集合中。
您将继续使用其中一个邻居,看看他们是否有颜色,该颜色尚未出现在颜色集中。只要您找到尚未见过的新颜色或达到 k-1 种颜色或您看到其中一个节点具有您已经看到的颜色,您就会这样做。在最后一种情况下,您中止任务并返回一切正常的地方。
重要提示:我们为节点着色。一条长度为 i 的路径,有 i+1 个节点和 i 边。
更正式:
让P i(v):= {S is element of ([k] choose i+1)| there exists a path, colored with the colors in S, which ends in v}
P 不是路径。 P 包含一些我们称之为 S 的颜色集。
在这种情况下,S 不是数字。它是不同颜色的基数 i+1 的子集。
例如:
P 3(v) 可能看起来像这样 = {{green, red, black, yellow}, {pink, orange, grey, yellow},{...}}。注意到“黄色”两次了吗?如果我继续使用更多的子集,“黄色”就会出现在每个集合中。为什么?因为它是我们端节点v的颜色!
所以P i(v) 至少包含一组S 的所有不同颜色,其中一条长度为i 的路径被着色。这条路径以v 结尾!
这是什么意思?
如果我们可以计算P k-1(v),并且集合不为空。存在一条长度为 k 的路径。太棒了。
但是我们如何计算P k-1(v)?
这并不难:
如果我们想计算P i(v)。我们需要什么?
我们需要P i-1(x). X?为什么? x 是v! ---> g ----> y ---> o -----> x ------> v 的邻居
假设{green, yellow, orange, color of x} 是P i-1(x) 的一个子集。我们称它为R。
记住? P i-1(x) 可以有许多不同的集合。它可能看起来像这样:{{green, red, black, yellow}, {pink, orange, gray, yellow},{...}}!
好的,那么与 R 和 x 和 v 的关系到底是什么?
R 是一组颜色,表示长度为 i-1 且通向 x 的彩色路径。如果顶点 v 是 x 的邻居,它的颜色还没有出现在 R 中,那么我们可以将它添加到 R。但是现在 R 已经获得了一种颜色。它的大小 |R| 现在是 i+2。
看来这一定是 P i(v) 的新子集之一!为什么是现在?
好吧,我们已经将路径扩展了一种颜色,因此最好将其保存在相应的集合中!
那么到目前为止我们看到了什么:
- 你有一个集合 P i(v),它包含子集 S,它本身包含 i+1 多种颜色(别忘了 v)
- 如果你有一个集合 P k-1(v),你有一条长度为 k 的路径,你可以喝一杯啤酒。
- P i(v) 可以通过 P i-1(x) 计算,其中 x 是 v 的邻居!好的部分是,您唯一需要检查的是 v 的颜色是否出现在 P i-1(x) 的一个子集中,我们称之为 R。
你如何从一开始就计算它?
你从 P 0(v) 开始,它就是 v 的颜色。
然后对于 v 的每个邻居 x,您计算 P 1(v)。如果你回想一下 i-1 的事情,P 1(v) 就是 P 1-1(x)。 P 0(x) 再次只是 x 的颜色。如果 x 和 v 的颜色不同,它们只是形成了 P 1(v) 的第一个子集!
然后通过计算 P 1(x) 来计算 P 2(v),P 1(x) 再次由 P 0(y) 计算,其中 y 是 x 的邻居。
只要我们还没有达到 P k-1(v),这种情况就会继续。
至于复杂性:这在 O(2^k km) 内运行。其中 m 是边的数量,k 是路径的长度。
所以现在我们可以在多项式时间内使用这个算法来搜索 k = log n 长的路径。如果它比那个大,那么它就不再是多项式了,不幸的是。
所以,现在我们有一个算法可以在多项式时间内找到一条“长”路径。可是等等。只有路径是彩色的,它才能这样做!
我不知道你住在哪里,但在我的世界里,图表默认不着色,尤其是不同颜色的路径。
我们必须这样做。
我们用 k 种不同的颜色为 k 长度的路径着色的概率是多少?
有k!用 k 种不同颜色为图形着色的多种方法。但是有 k^k 种不同的方法可以用 k 种不同的颜色为路径着色,它们可能会出现多次。示例:对于黄色 = y 和绿色 = g,您有 2!=2 个选项,其中颜色必须不同:(y,g) 或 (g,y)。当颜色不必不同时,您有 k^k = 2^2 = 4 个选项。 (y,y),(g,g) 和你已经看过的那些。
所以 Pr[Path 用 diff 着色。 colors]=k!/k^k,大于 e^-k,与 1/e^k 相同。
所以你同意概率很小,对吧?
获得第一次成功的预期尝试次数是多少?
这是一个几何分布,期望值 = 1/p = e^k。
所以我们认为,在 e^k 尝试之后,我们可以第一次希望我们有一条彩色的路径。有时它更少,有时它更多。
问题。一次尝试失败的概率是 1-e^-k,非常大。但是如果我们说执行这个 Te^k 次,那么概率。 Te^k 连续失败变得非常小: (1-e^-k)^Te^k
算法现在看起来如何?
- 用 k 种不同的颜色随机给图形着色。
- 执行检查是否有彩色路径的算法
有的话就退货。如果不继续。
- 重复步骤 1 和 2 Te^k 次。 (这很有趣,相信我)。
实际上不是。让电脑来做吧。
这种算法称为蒙特卡洛型随机算法。
它的运行时间在 O(Te^k2^kkm) 并且错误的“不,没有路径(但实际上有路径)”的概率是小于 e^-T(同样,非常小。)再次,对于 k = log n,这个随机算法实现多项式运行时间!