【问题标题】:Fixed length path between two graph nodes两个图节点之间的固定长度路径
【发布时间】:2009-10-22 04:49:06
【问题描述】:

如果给定图上的两个节点,是否有一种算法可以在它们之间找到一条采用指定跳数的路由?任何节点都可以连接到任何其他节点。

目前的点位于二维空间中,所以我不确定图表是否是最好的方法。

【问题讨论】:

  • 我不确定是否存在一个好的算法,但我知道你并不总是会有一个有效的解决方案。例如,如果你有一个三角图,你不会找到从 A 点到 B 点需要 3 跳的路径。
  • 如果您被允许重新访问节点,您可以,例如绕圈旅行。要从 1 到 2,请走 1-3-1-2。 3 跳,你就在那里。

标签: graph nodes points


【解决方案1】:

你试过iterated-deepening DFS吗?

【讨论】:

    【解决方案2】:

    如果您有节点正在寻找根据跳数的路线,那么图表可能是正确的方法。不过,我不确定我是否理解您要做什么以及限制是什么,尤其是关于“任何节点都可以连接到任何其他节点”......这似乎有点开放。

    然而,不管它;带有一些图形表示:

    似乎从第一个节点开始,并从那里进行深度优先搜索,如果 (a) 所采用的跳数大于您指定的数字或 (b) 我们已经到达第二个节点,则终止搜索;这将确定在(最多)许多跳中连接两个节点的第一条(不仅是)路径。

    如果它必须完全是指定的跃点,如果跃点已经过去,则终止搜索的任何分支,如果您也到达第二个节点,则成功终止。

    【讨论】:

      【解决方案3】:

      愚蠢的方法:(数据结构是堆栈数组)。这基本上是对深度 N 进行广度优先搜索 (BFS),除了如果允许循环(您没有澄清,但我认为是),您不会将访问的节点排除在进一步搜索之外。

      1. 将起始节点推入存储在数组中索引 0 (index=depth) 的堆栈上

      2. 对于每个级别/索引“l”0-N:

        对于存储在“l”级的堆栈中的每个节点,找到其所有邻居,并将它们推送到存储在“l+1”级的堆栈中。

        重要提示:如果您的任务允许查找包含循环的路径,请不要检查您是否已经访问过您添加的任何节点。如果不允许循环,请使用已访问节点的哈希,不要添加任何节点两次**

      3. 在“N-1”级结束时停止。

      4. 遍历您刚刚添加到堆栈索引“N”处的所有节点并找到您的目标节点。如果找到:成功,如果没有,没有这个路径。

      请注意,如果“每个节点都可以连接”是指完全连接的图,那么存在一个不涉及实际访问节点的数学答案

      (不过公式太长,在StackOverflow的文本输入字段中写不出来)

      【讨论】:

      • 开个玩笑 - 如果完全连接图 N >= 3 的节点数,则可能在任意步数 S 中从任意节点移动到任意节点。如果 S%3==0,绕任意三角形运行 S/3-1 次,然后到达任意其他节点,返回目的地,然后到达目标节点。如果 S%3==1,则绕任意三角形运行 S/3-1 次,然后前往目标节点。如果 S%3==2,则绕任意三角形运行 S/3-1 次,然后到任何其他节点,然后到目标节点。完成。
      猜你喜欢
      • 2015-09-05
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多