图中最长的路径

时间:2011-11-08 15:28:03

标签: algorithm graph longest-path

自从过去2天以来,我试图找到计算图中最长路径的逻辑。我知道我可以很容易地找到DAG,一般来说它是多项式时间算法。通常,我想实现计算的启发式最长路径,更多,如果给出概率p,图中存在边缘,我们如何解决问题..帮助......

4 个答案:

答案 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)

反转路径的权重并运行最短路径算法。得到的最低数字(最负数)是最长路径。