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