Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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
Algorithm 找到从一个节点到另一个节点的成本最低的最短路径?_Algorithm_Graph_Graph Algorithm_Shortest Path - Fatal编程技术网

Algorithm 找到从一个节点到另一个节点的成本最低的最短路径?

Algorithm 找到从一个节点到另一个节点的成本最低的最短路径?,algorithm,graph,graph-algorithm,shortest-path,Algorithm,Graph,Graph Algorithm,Shortest Path,我有一个加权图G和一对节点s和t。我想找到,从s到t的所有路径中,边数最少的一条,总成本最低的一条。我不知道该怎么做。以下是我的想法: 我正在考虑寻找最短路径,如果有多条路径,那么我应该比较这些路径的步数 我想我可以通过将所有边的权重设置为1并计算距离来找到步数 一个合理的起点是Dijkstra算法,它可以解决这个问题的每一部分(最小化边数或最小化总长度)。挑战在于让它同时做到这两个方面 通常,当谈到最短路径时,我们认为路径具有单一成本。但是,您可以想象为路径分配两种不同的成本:一种成本完全基

我有一个加权图G和一对节点s和t。我想找到,从s到t的所有路径中,边数最少的一条,总成本最低的一条。我不知道该怎么做。以下是我的想法:

  • 我正在考虑寻找最短路径,如果有多条路径,那么我应该比较这些路径的步数

  • 我想我可以通过将所有边的权重设置为1并计算距离来找到步数


一个合理的起点是Dijkstra算法,它可以解决这个问题的每一部分(最小化边数或最小化总长度)。挑战在于让它同时做到这两个方面

通常,当谈到最短路径时,我们认为路径具有单一成本。但是,您可以想象为路径分配两种不同的成本:一种成本完全基于边的数量,另一种成本完全基于这些边的权重。然后可以将路径的成本表示为一对(长度、权重),其中长度是路径中的边数,权重是所有这些边的总权重

想象一下在图上运行Dijkstra算法,并进行以下修改。首先,不是跟踪到图中每个节点的候选距离,而是跟踪到每个节点的一对候选距离:候选长度和候选权重。其次,每当需要获取最低的代码节点时,选择长度(而不是重量)最短的节点。如果具有相同长度的多个节点之间存在连接,请通过选择权重最低的节点来打破连接。(如果你听说过词典编纂顺序,你可以把它看作是一个节点(长度,重量)首先是词典编纂的)。最后,无论何时通过将路径延伸一条边来更新距离,都要更新该节点的候选长度和候选权重。您可以显示此过程将计算到每个节点的最佳路径,其中“最佳”表示“所有边数最少的路径中,成本最低的路径。”

您也可以通过修改图中边的所有代价来实现上述技术。假设图中的最大成本边具有成本U。然后执行以下操作:将U+1添加到图中的所有成本,然后对结果运行Dijkstra算法。这样做的净效果是,新图形中的最短路径将是使所用边数最小化的路径。为什么?每一条边都会给路径的代价加上U+1,并且U+1大于图中任何一条边的代价,因此如果一条路径比另一条路径便宜,那么它要么使用最少一条边,要么使用相同数量的边,但权重较低。事实上,你可以证明这种方法与上面使用成对权重的方法基本相同——这是一个很好的练习


总的来说,这两种方法都将与普通的Dijkstra算法(O(m+n log n)与Fibonacci堆,O(m log n)与另一种堆)同时运行,这非常酷

一个合理的起点是Dijkstra算法,它可以解决这个问题的每一部分(最小化边数或最小化总长度)。挑战在于让它同时做到这两个方面

通常,当谈到最短路径时,我们认为路径具有单一成本。但是,您可以想象为路径分配两种不同的成本:一种成本完全基于边的数量,另一种成本完全基于这些边的权重。然后可以将路径的成本表示为一对(长度、权重),其中长度是路径中的边数,权重是所有这些边的总权重

想象一下在图上运行Dijkstra算法,并进行以下修改。首先,不是跟踪到图中每个节点的候选距离,而是跟踪到每个节点的一对候选距离:候选长度和候选权重。其次,每当需要获取最低的代码节点时,选择长度(而不是重量)最短的节点。如果具有相同长度的多个节点之间存在连接,请通过选择权重最低的节点来打破连接。(如果你听说过词典编纂顺序,你可以把它看作是一个节点(长度,重量)首先是词典编纂的)。最后,无论何时通过将路径延伸一条边来更新距离,都要更新该节点的候选长度和候选权重。您可以显示此过程将计算到每个节点的最佳路径,其中“最佳”表示“所有边数最少的路径中,成本最低的路径。”

您也可以通过修改图中边的所有代价来实现上述技术。假设图中的最大成本边具有成本U。然后执行以下操作:将U+1添加到图中的所有成本,然后对结果运行Dijkstra算法。这样做的净效果是,新图形中的最短路径将是使所用边数最小化的路径。为什么?每一条边都会给路径的代价加上U+1,并且U+1大于图中任何一条边的代价,因此如果一条路径比另一条路径便宜,那么它要么使用最少一条边,要么使用相同数量的边,但权重较低。事实上,你可以证明这种方法与上面使用成对权重的方法基本相同——这是一个很好的练习


总的来说,这两种方法都将与普通的Dijkstra算法(O(m+n log n)与Fibonacci堆,O(m log n)与另一种堆)同时运行,这非常酷

一个节点到另一个节点将是最短路径算法(例如Dijkstra)。 这取决于您的输入是否使用启发式函数来确定