Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Performance 在具有节点和边权重的图中寻找最短路径?_Performance_Algorithm_Language Agnostic_Graph_Complexity Theory - Fatal编程技术网

Performance 在具有节点和边权重的图中寻找最短路径?

Performance 在具有节点和边权重的图中寻找最短路径?,performance,algorithm,language-agnostic,graph,complexity-theory,Performance,Algorithm,Language Agnostic,Graph,Complexity Theory,假设我有一个边和顶点都有权重的加权图。如何找到从某个节点s到某个节点t的“最便宜”路径?我的复杂度应该是O(n2(n+m))。解决这个问题的一种方法是将图转换为一个新的图,其中只对边进行加权,而不对顶点进行加权。为此,可以按如下所示将每个节点拆分为两个节点。对于任何节点v,创建两个新节点v1和v2。以前进入节点v的所有边现在都进入节点v1,离开节点v的所有边现在都离开v2。然后,在v1和v2之间放置一条边,其代价是节点v的代价 在这个新的图中,从一个节点到另一个节点的路径的代价与原始图中原始路径

假设我有一个边和顶点都有权重的加权图。如何找到从某个节点s到某个节点t的“最便宜”路径?我的复杂度应该是O(n2(n+m))。

解决这个问题的一种方法是将图转换为一个新的图,其中只对边进行加权,而不对顶点进行加权。为此,可以按如下所示将每个节点拆分为两个节点。对于任何节点v,创建两个新节点v1和v2。以前进入节点v的所有边现在都进入节点v1,离开节点v的所有边现在都离开v2。然后,在v1和v2之间放置一条边,其代价是节点v的代价

在这个新的图中,从一个节点到另一个节点的路径的代价与原始图中原始路径的代价相对应,因为所有的边权重仍然被支付,并且所有的节点权重现在都使用新插入的边来支付

构建这个图应该在时间O(m+n)内是可行的,因为您需要精确地更改每个边一次,并且每个节点精确地更改一次。从这里开始,您可以使用普通的Dijkstra算法在时间O(m+nlogn)内解决问题,给出O(m+nlogn)的总体复杂度。如果存在负权重,则可以使用Bellman-Ford算法,总复杂度为O(mn)

希望这有帮助

以下修改应该有效

  1  function Dijkstra(Graph, source):
     2      for each vertex v in Graph:                                // Initializations
     3          dist[v] := infinity ;                                  // Unknown distance function from 
     4                                                                 // source to v
     5                                                                 // Previous node in optimal path
     6      end for                                                    // from source
     7      
     8      dist[source] := source.cost ;                                        // Distance from source to source
     9      Q := the set of all nodes in Graph ;                       // All nodes in the graph are
    10                                                                 // unoptimized - thus are in Q
    11      while Q is not empty:                                      // The main loop
    12          u := vertex in Q with smallest distance in dist[] ;    // Start node in first case
    13          remove u from Q ;
    14          if dist[u] = infinity:
    15              break ;                                            // all remaining vertices are
    16          end if                                                 // inaccessible from source
    17          
    18          for each neighbor v of u:                              // where v has not yet been 
    19                                                                 // removed from Q.
    20              alt := dist[u] + dist_between(u, v)+v.cost ;
    21              if alt < dist[v]:                                  // Relax (u,v,a)
    22                  dist[v] := alt ;
    23                                 
    24                  decrease-key v in Q;                           // Reorder v in the Queue
    25              end if
    26          end for
    27      end while
    28  return dist;
1函数Dijkstra(图,源):
图中的每个顶点v有2个://初始化
3距离[v]:=无穷大;//未知距离函数
4//源到v
5//最优路径中的前一个节点
6源代码//的结尾
7.
8 dist[source]:=source.cost;//源到源的距离
9 Q:=图中所有节点的集合;//图中的所有节点都是
10//未优化-因此在Q中
11当Q不为空时://主循环
12 u:=Q中距离最小的顶点[];//在第一种情况下启动节点
13从Q中去除u;
14如果距离[u]=无穷大:
15休息;//所有剩余顶点都是
16如果//无法从源访问,则结束
17
18对于u的每个相邻v://其中v尚未
19//从Q中删除。
20 alt:=dist[u]+介于(u,v)+v.成本之间的dist_;
21如果alt
我认为可以将图G转换成图G,在图G'中,我们只有边加权。转换的算法非常简单,因为我们对边和节点都进行了加权,当我们从A->B移动时,我们知道从A移动到B的总权重是边的权重(A->B)加上B本身的权重,所以让我们将这两个权重和B的权重之和设为零。然后我们可以找到从任意节点s到任意节点到in O(mlogn)的最短路径,其中(n-节点数,m-边数)

是否有负权重?