【问题标题】:Longest path in graph图中最长路径
【发布时间】:2023-03-13 19:21:02
【问题描述】:

自从过去 2 天以来,我一直在尝试找到一些用于计算图中最长路径的逻辑。我知道我可以很容易地为 DAG 找到它,而且通常它是多项式时间算法。形式上,我想实现启发式计算最长的路径,此外,如果给定概率p,其中一条边出现在图中,我们如何解决这个问题..帮助...

【问题讨论】:

  • 最好的方法是回溯,实际上你应该访问所有可能的路径以在最坏的情况下找到答案。

标签: algorithm graph longest-path


【解决方案1】:

据我所知,计算最长路径不能在多项式时间内完成。按照最长路径算法的 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;
}

}

【讨论】:

  • 你可以在运行之前做一些优化。对于每个节点,检查它是否只有两个连接。如果是,则删除该节点,在它连接的节点之间创建一条边,该边等于连接到该节点的路径的总和。您还可以删除一些只有一个连接的节点(将获取它们的成本添加到它们所连接的节点)。请注意,如果这样做,您最多只能数两个,具体取决于您从哪里开始/完成
【解决方案2】:

Dijkstra 不能用于权重为负的图 - Wiki article on Dijkstra's

Dijkstra 算法,由荷兰计算机科学家 Edsger Dijkstra 于 1956 年构想并于 1959 年发表,1 是一种图搜索算法,用于解决具有非负 的图的单源最短路径问题> 边缘路径成本 ...

所以你不能否定所有边权重并使用 Dijkstra's,你可以做的是否定所有边权重并使用 Bellman-Ford 算法 - Wiki article on Bellman-Ford

Bellman–Ford 算法是一种计算从单个源顶点到加权有向图中所有其他顶点的最短路径的算法。1 对于相同的问题,它比 Dijkstra 的算法慢,但更通用,因为它能够处理一些边权重为负数

的图

编辑:最短路径(具有最大负值)是原始图中最长的路径。

注意:如果你的图中有正循环,你将找不到解决方案,因为最长的路径在这样的图中不存在。

【讨论】:

    【解决方案3】:

    您总是可以只使用breadth first search (BFS),并且每当您向图中添加一条边时,您的成本就是加法逆(乘以 -1)。这样,您就可以通过使用最长的边找到“最短路径”。因为您正在执行标量变换,所以您不会失去在组内添加的能力(如果使用乘法逆运算,您确实会失去这种能力)。

    【讨论】:

    • 所以P+NP?首先展示你的证明,然后决定如此快速、最短的路径,正如你所说的,用于非负循环的图,请参阅 wiki ...
    • 假设只有正权重,BFS 可以正常工作。他的解释表明存在某些边缘会出现的“概率”,虽然严格来说这不是一个合理的假设(只会有正边缘),但有一个简单的案例拆分:允许负循环-> NP-完全的 ;或禁止它们 -> 使用修改后的(最短路径算法 | 图)。
    • 但是您的假设在太多情况下会产生负循环,因此您当前的方法没有意义,而带有负循环的图在正常情况下也没有意义。
    • 但我认为我可以使用 DFS 代替 BFS。我将在每个节点上运行 DFS,至少在一个节点上,DFS 将访问所有顶点。这将是图中最长的路径对吗?但是在这种方法中,我不知道在哪里可以使用概率..??
    【解决方案4】:

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

    【讨论】:

    • 你是对的,但是图中边存在的概率也给出了......那么我该如何在计算中使用概率?
    • 最短路径算法需要少量低权重的边。最长路径算法需要许多低权重的长边。最短路径算法不会帮助您找到最长路径。
    • 如果我把每条边都设为负数并运行最短路径算法,它可以给我想要的结果(因为最小化正值与最大化负值相同)......但是你将如何使用 p-算法中的“图中存在边的概率”..
    • -1 最短路径用于非负循环图(在 P 中)。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多