自从过去2天以来,我试图找到计算图中最长路径的逻辑。我知道我可以很容易地找到DAG,一般来说它是多项式时间算法。通常,我想实现计算的启发式最长路径,更多,如果给出概率p,图中存在边缘,我们如何解决问题..帮助......
答案 0 :(得分:2)
据我所知,计算最长路径不能在多项式时间内完成。在java实现最长路径算法之后,找到给定源的正加权图的最长路径,但在最坏的情况下需要指数时间。
public class LongestPath {
static int times;
public double initLongestPath(ArrayList<Vertex> V,Vertex source){
for(Vertex u:V){
u.setVisited(false);
}
return getLongestPath(source);
}
public double getLongestPath(Vertex v){
++times;
System.out.println(times);
double w,dist,max=0;
v.setVisited(true);
for(Edge e:v.getOutGoingEdges()){
if(!e.getToNode().isVisited()){
dist=e.getWeight()+getLongestPath(e.getToNode());
if(dist>max)
max=dist;
}
}
v.setVisited(false);
return max;
}
}
答案 1 :(得分:1)
Dijkstra不能用于负权重的图表 - Wiki article on Dijkstra's
Dijkstra算法由荷兰计算机科学家Edsger Dijkstra于1956年构思并于1959年发布,1是一种图搜索算法,可解决非负<的图的单源最短路径问题/ strong>边缘路径成本......
所以你不能否定所有边缘权重并使用Dijkstra's,你可以做的是否定所有边权重并使用Bellman-Ford算法 - Wiki article on Bellman-Ford
Bellman-Ford算法是一种算法,用于计算从单个源顶点到加权有向图中所有其他顶点的最短路径。1对于同样的问题,它比Dijkstra算法慢,但更通用,因为它能够处理一些边缘权重负数
的图形
编辑:最短路径(最负值)是原始图表中最长的路径。
注意:如果图表中有正循环,则无法找到解决方案,因为此类图表中不存在最长路径。
答案 2 :(得分:-2)
您总是可以使用breadth first search(BFS),并且每当您向图表添加边缘时,您都需要将其作为加法逆(将其乘以-1)。这样,您可以通过使用最长边找到“最短路径”。因为你正在进行标量转换,所以你不会失去在组内添加的能力(如果你使用乘法逆,你会失败)。
答案 3 :(得分:-3)
反转路径的权重并运行最短路径算法。得到的最低数字(最负数)是最长路径。