【问题标题】:Finding the path from a list of adjacency information从邻接信息列表中查找路径
【发布时间】:2013-01-28 13:49:10
【问题描述】:

我在数据库中有以下形式的数据:

A -> B
C -> D
B -> C
F -> G
G -> J
X -> Z

这基本上意味着 A 到 B,C 到 D 等等。给定这些数据和一个节点(例如 C),我想构建找到 C 的 complete 路径是A -> B -> C -> D 。我尝试通过使用一些字典和递归循环来做到这一点,但我不喜欢这种缓慢的解决方案,因为 db 中有很多数据。有什么更好的方法来解决这个问题?在算法和数据结构方面?任何想法或提示表示赞赏。

【问题讨论】:

  • "The" 完整路径?可能有多个完整路径。或者没有完整的路径。
  • “完整路径”是Hamiltonian Path?如果是这样,您将面临一个称为Hamiltonian Path Problem 的 NP 完全问题,并且没有已知的多项式解决方案
  • @CédricBignon 完整路径是指C之前和之后的路径。总有一条路径可以从数据中构造出来,并且不能有多个路径(由于结构的定义)
  • @amit 这不是汉密尔顿路径。路径是定向的,不必从所有顶点经过
  • 那我不明白问题所在,请描述一下。

标签: c# algorithm graph path


【解决方案1】:

您基本上是在寻找DFS,但您需要进行两次 - 每个方向一次。

首先在反向“图”上做一个 DFS,从 C 开始。
在你的例子中,它会给你Path1 = C->B->A

接下来,对原始图进行 DFS,再次从 C 开始。
在你的例子中,它会给你Path2= C->D

现在,通过反转Path1,并将Path2 连接到它,您将得到:

reverse(Path1)  + Path2 = A->B->C + C->D = A->B->C->D

澄清 - DFS 只是抽象,你实际上在做的是类似于(伪代码):

current <- C
list = []
while (current != null):
   list.addFirst(current)
   current <- u such that (u,current) is in the DataBase
current <- C
list.deleteLast() // last is C
while (current != null):
   list.addLast(current)
   current <- u such that (current,u) is in the DataBase

请注意,查找u 这两种情况都是一个简单的字典查找,第一种情况是“目标”是键,第二种情况是“源”是键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多