【问题标题】:How to find the shortest path in a graph, that has to go through a list of points and go back to the start?如何在图中找到必须通过点列表并返回起点的最短路径?
【发布时间】:2021-08-22 12:46:08
【问题描述】:

我正在处理一个编码问题,其中给您一个无向、未加权的图、一个起点和一个您必须访问的点列表。该图有 n 个节点和 n-1 条边。如何找到从节点 1 开始、经过列表中的所有点并在节点 1 结束的路径的最短距离。允许多次通过同一节点/边。

输入: 第一行:整数 n 表示总共有多少个节点(编号 1-n),然后整数 k 表示有多少必须访问的节点。 第二行:k 个整数,表示必须访问的节点 下一行:表示它们之间有一条边的整数对

输出:描述的最短路径长度

示例: 在: 5 2 4 5 1 2 2 3 2 4 1 5

输出: 6

我正在考虑找到节点 1 和所有必须访问的节点之间的最短路径(例如使用 Djikstra),但我不确定从那里去哪里。 Python 代码将不胜感激。

【问题讨论】:

  • 网上有吗?数量有限制吗?
  • 如果图存在哈密顿圈,则最优解就是它,因此最优解似乎揭示了图是否包含哈密顿圈,这本身就是一个具有挑战性的问题。
  • 可以,总节点数和必访节点数都可以达到100000

标签: python algorithm graph-theory


【解决方案1】:

要找到一条访问所有需要的节点的路径,A, B, .. N

Loop V over required nodes
     Find path from V to V+1 using Dijkstra
     Add path to solution
     IF V = N-1
        STOP

求最短路径

Loop S over all order permutations of required nodes
     Run above algorithm
     If length of path found shorter than best previous
          replace best previous

【讨论】:

  • 嗯,谢谢,但是如果问题的约束是必须访问的节点数最多可以达到 100 000,这会不会太慢?你对如何让它更快有什么想法吗?
  • 加快速度的最简单方法是放弃 python 并使用编译语言。 C++ 将快 50 倍左右。
  • 建议:为您的 100,000 节点问题发布一个输入链接,我将测量性能。
  • po.kattis.com/problems/ekorren 在瑞典语中,但您也许可以谷歌翻译该网站
  • 是的,我可以尝试用 C++ 编写它,但我仍然认为它会太慢。但我会尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多