Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找必须使用两个节点列表中任意两个节点的最短路径_Python_Python 3.x_Dijkstra - Fatal编程技术网

Python 查找必须使用两个节点列表中任意两个节点的最短路径

Python 查找必须使用两个节点列表中任意两个节点的最短路径,python,python-3.x,dijkstra,Python,Python 3.x,Dijkstra,我实现了一个函数,它使用Dijkstra算法在加权无向图(正权重)中找到从给定源节点到任意给定目标节点的最短(最低权重)路径 我有两个列表A和B,每个列表都至少包含一个节点位置,并且它们包含的每个节点都是有效的(在图中)。列表A中的节点也可以在列表B中,反之亦然 我需要扩展我的函数,以便它也将列表A和B作为输入,并找到从源节点到目标节点的最短路径,该路径至少使用A和B中的一个节点。此外,虽然它可以在路径中的任意点使用A和B节点,但它必须在使用A节点后使用B节点(或使用A和B中的节点) 如果节点同

我实现了一个函数,它使用Dijkstra算法在加权无向图(正权重)中找到从给定源节点到任意给定目标节点的最短(最低权重)路径

我有两个列表A和B,每个列表都至少包含一个节点位置,并且它们包含的每个节点都是有效的(在图中)。列表A中的节点也可以在列表B中,反之亦然

我需要扩展我的函数,以便它也将列表A和B作为输入,并找到从源节点到目标节点的最短路径,该路径至少使用A和B中的一个节点。此外,虽然它可以在路径中的任意点使用A和B节点,但它必须在使用A节点后使用B节点(或使用A和B中的节点)

如果节点同时位于a和B中,则它立即满足此要求

源节点和目标节点都可以位于A和/或B中

e、 g

有效路径(S为源,D为目标,N为不在A或B中的节点):

  • S>A>B>D
  • S>B>A>B>D
  • S>N>B>A>N>B>D
  • S>(A&B)>D
  • S(A)>D(B)
无效路径:

  • S>B>A>D

我怎样才能扩展它,使它保持Dijkstra算法的复杂性,O(Elog(V))?E是边的,V是顶点的。我在想,一定有一种方法,我可以使用Dijkstra的算法,以恒定的次数,这样复杂性就不会改变。为任何帮助干杯。

我建议通过跟踪每个节点的两个以上值来扩展Dijkstra。访问A的最短路径和访问A>B的最短路径(A和B)

通常,您会跟踪到Dijkstra中每个节点的最短路径。现在,您将跟踪三条最短路径。您仍将处理单个步骤并向队列中添加新邻居,但这一次有三种可能:

  • 未访问A而到达节点:对于不在A中的所有邻居,更新暂定的“无A”距离。对于处于A中的所有邻居,更新暂定“具有”距离。对于A和B中的所有邻居,更新暂定的“A>B”距离

  • 到达了访问A但不访问B的节点。对于不在B中的所有邻居,更新暂定的“A”距离。对于B中的所有邻居,更新暂定的“A>B”距离

  • 到达访问A的节点,然后访问B如果是最终节点,则找到结果。否则,更新所有邻居的暂定“A>B”距离

  • 始终选择具有最小暂定距离的节点,如原始算法中所示。因此,到达节点的条件并不重要。

    给定的复杂性是不正确的。它应该是O(V+Elog(V))或O(E+Vlog(V)),我想这可能就是它!我目前正在做这件事,我会告诉你我的进展。