Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Graph 有向加权图中从一个顶点到另一个顶点的最长路径_Graph_Path_Graph Algorithm_Cyclic - Fatal编程技术网

Graph 有向加权图中从一个顶点到另一个顶点的最长路径

Graph 有向加权图中从一个顶点到另一个顶点的最长路径,graph,path,graph-algorithm,cyclic,Graph,Path,Graph Algorithm,Cyclic,该图是正加权的,可能是非循环的,也可能不是 输入文件包括 顶点编号、边编号、起始顶点、结束顶点 边缘1(从,到,重量) 边缘2(从、到、重量) 等等 如果图中有循环,路径的长度将是无限的,如果没有办法,路径的长度将是0 我这样做的方式是,我删除相同的边,长度较小,并在邻接列表或矩阵中使用bellman ford或dijkstra算法,两者都可以很好地工作 然而,程序应该在最多2秒钟内找到路径,一些输入文件包含10000个顶点和100000条边 我该怎么办?时间限制是2秒,这意味着程序应该有大约1

该图是正加权的,可能是非循环的,也可能不是

输入文件包括

顶点编号、边编号、起始顶点、结束顶点

边缘1(从,到,重量)

边缘2(从、到、重量) 等等

如果图中有循环,路径的长度将是无限的,如果没有办法,路径的长度将是0

我这样做的方式是,我删除相同的边,长度较小,并在邻接列表或矩阵中使用bellman ford或dijkstra算法,两者都可以很好地工作

然而,程序应该在最多2秒钟内找到路径,一些输入文件包含10000个顶点和100000条边


我该怎么办?

时间限制是2秒,这意味着程序应该有大约10^6次迭代。请参见
V=10000
e=100000
的限制。这意味着一个O(V)或O(E)或O(V+E)的算法,甚至
O(E+VlogV)
可以很容易地在给定的时间内计算出您的需求

Note E + Vlogv ~ (100000 + ~132877) which is less than 10^6
//此10^6限制适用于频率为10^9 Hz的处理器。所以,即使您的algo每次迭代都有1000条指令,您也将处于安全区域

因此,以下是建议的算法:

  • 您将在
    O(E)
    中构建图形。使用邻接列表数据结构表示图形。 ->在构建此数据结构时,存储每个顶点的indegree,还存储顶点数

    countV := V;
    foreach edge_i 
        inDegree[to] := inDegree[to] + 1;
    
  • 检查
    O(V+E)
    中的图形中是否有循环

  • 所以如果你得到一个循环,你的答案是无限的

  • 制作BFS或DFS以获取是否可以从
    开始顶点访问
    结束顶点。这可以在
    O(V+E)
    或甚至
    O(E)
    中完成。让我们用
    O(V+E)
    。如果无法访问,您的答案将直接为0

  • 现在,使用dijkstra,但在放松状态下,只需检查相反的情况。i、 e在给定的伪代码中,而不是

    if alt < dist[v]:
        dist[v]  := alt;
    

    这可以在
    O(E+VlogV)
    中完成。因此,解决方案的总体复杂性将是
    O(E+VlogV)
    ,这是一个很好的约束条件。

    要在这个网站上获得一些帮助,你应该展示你已经拥有的程序代码,包括编程语言。。。
    if alt < dist[v]:
        dist[v]  := alt;
    
        if alt > dist[v]:                                 
            dist[v]  := alt;