是否可以执行某种预处理,以便有效(快速)回答问题?
图形是连接的,无向的,没有自环,也没有平行边缘(一个周期由至少3个节点组成)。
请注意,这是一个是/否查询,这意味着我只需要知道这样的循环是否退出,哪一个无关紧要。
编辑:到目前为止我的进展(基于 Nursultan 提示)以及我阻止的位置:
我通过关节点将图形分成子组件,然后将它们最初分离的每个子组件中的关节点加倍。这来自以下观察:3个给定顶点可能属于一个循环 iff 它们都属于没有关节点的组件。我没有证明这一点,但我想不出一个反例。
假设上面的观察是正确的(这似乎很可能),现在的问题是查询中的3个给定顶点可能都是清晰点,在这种情况下它们都属于几个组件,在最坏的情况下可能导致O(n)查询时间复杂度变慢。
另一个似乎有助于解决所描述的最坏情况的观察结果是:最多有1个子图,其中2个给定的关节点可能同时属于两个(我可以证明这一点,如果需要),观察结果容易导致最坏的情况是预处理空间和时间O(n ^ 2)(n是顶点数),而不是恒定时间查询,但O(n ^ 2)预处理时间太慢(O(n ^ 2)空间也太贪心了。可以改进预处理吗?如果记录log(n)查询时间费用就可以了。
答案 0 :(得分:2)
让我们将您的图分割成几个子图,它们具有以下属性:
每个子图中的每个顶点都属于某个循环并使用它 你可以从这个子图中移动到任何顶点。
因此,您可以通过检查它们是否属于某个子图来检查三个顶点是否属于一个循环。它可以在O(log V)
中完成那么我们如何划分这样的图形?
注意:正如@ALTN所说,这不是一个正确的解决方案。所以也许你还必须在清晰点中划分每个子图。 http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/
答案 1 :(得分:1)
将A
作为图的邻接矩阵。 A^l_{i,j}
为您提供长度为i
的{{1}}到j
的路径数。因此l
是节点A^l_{i,i}
的周期数。
预先计算i
的所有A^l
。让l>=3
成为节点。假设它们是同一循环的一部分,那么它们中的每一个都具有相同长度的循环。因此,如果n_1, n_2, n_3
至少有一个周期,请检查相同的A^l
。但它们可以处于不同的周期。因此,对于满足之前条件的每个A^l_{n_i, n_i}
,请查看您是否可以在l
d_i, 1 <= i <= 3
之间找到n_1 -> n_2 -> n_3 -> n_1
这样的sum(d_i) = l
。由于您已经计算了集合{A^l}
,因此这很容易。