检查是否可以从DG中的节点S到达节点T

时间:2019-11-29 19:39:40

标签: graph graph-algorithm dijkstra

在无向图中,可以很容易地将图预划分为组件,并用标识组件的数字标记它们。因此,如果两个节点都具有相同的标签,则检查是否可以通过从S的路径到达节点T是正确的。

是否可以在有向图中执行类似的操作?基本上,要预先计算然后做一个简单的查找,是否可以在没有任何DFS的情况下从S到达T?

1 个答案:

答案 0 :(得分:2)

除了可及性矩阵及其优化的最幼稚的实现(这是O(n ^ 2)的复杂性。恐怕没有固定的时间查找。

尽管有一些有趣的想法。我将在下面列出其中两个:

1)找到一组覆盖原始图G的树。使得1

每个顶点V的索引如下:

For each t_i in T

    V is indexed by (t_i, a, b) where a is the smallest postorder of descendants in the tree and b is the postorder of V in the tree.

为了查询到达率(u,v),我们要查找是否存在一对(t_i,a_u,b_u)(t_i,a_v,b_v)< / em>,这样 u_a <= v_b 。有关详细信息,请参见

  

R。 Agrawal,A。Borgida和H.V. Jagadish。高效管理   大数据和知识库中的传递关系。在   1989年ACM SIGMOD国际会议论文集   数据管理(SIGMOD 1989),1989。

然后,问题就减少到如何找到覆盖图G的最小树集T。这样做的方法有多种。

2)另一种方法是n-hop(请参阅SODA 02出版物)

  

伊迪丝·科恩(Edith Cohen),伊兰·哈珀林(Eran Halperin),海姆·卡普兰(Haim Kaplan),乌里·茨维克(Uri Zwick)通过2跳标签查询可到达性和距离

Let G = (V, E) be a directed graph. 
For v in V
    L(v) = (L_in(v), L_out(v)), such that L_in(v), L_out(v) ⊆ V and there is a path from every x ∈ L_in(v) to v and from v to every x ∈ L_out(v).  

然后将问题减少为找到最佳的两跳覆盖

  

让G =(V,E)为图。对于每个u,v∈V,令P_uv为a   u到v的路径集合(对于无向图,我们有P_uv≡   P_vu)。令P = {P_uv}。我们将一跳定义为一对(h,u),其中h是一个   G和u∈V中的路径是h的端点之一。我们称你为   跳的句柄。跃点H的集合被称为2跳覆盖   如果每个u,v∈V使得Puv 6 =φ,则存在一个路径p∈   Puv和两跳(h1,u)∈H和(h2,v)∈H,使得p = h1h2,   即p是h1和h2的串联。封面尺寸是   | H |,H中的跳数。