Algorithm 图中的最长路径

Algorithm 图中的最长路径,algorithm,graph,longest-path,Algorithm,Graph,Longest Path,从最近两天开始,我一直在尝试寻找一些计算图中最长路径的逻辑。我知道我可以很容易地找到DAG,通常它是多项式时间算法。形式上,我想实现计算最长路径的启发式算法,更重要的是,如果图中存在边的概率p给定,我们如何解决问题..帮助…反转路径的权重并运行最短路径算法。得到的最小值(最负)是最长路径。您可以始终使用a(BFS),并且,每当您向图形添加边时,它的成本为加法逆(将其乘以-1)。这样,您就可以通过使用最长的边来找到“最短路径”。因为你在做一个标量变换,所以你不会失去在组内进行加法的能力(如果你使用

从最近两天开始,我一直在尝试寻找一些计算图中最长路径的逻辑。我知道我可以很容易地找到DAG,通常它是多项式时间算法。形式上,我想实现计算最长路径的启发式算法,更重要的是,如果图中存在边的概率p给定,我们如何解决问题..帮助…

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

您可以始终使用a(BFS),并且,每当您向图形添加边时,它的成本为加法逆(将其乘以-1)。这样,您就可以通过使用最长的边来找到“最短路径”。因为你在做一个标量变换,所以你不会失去在组内进行加法的能力(如果你使用乘法逆,你会失去这种能力)。

Dijkstra's不能用于具有负权重的图-

Dijkstra算法,由荷兰计算机科学家Edsger Dijkstra于1956年提出,并于1959年发表,是一种图搜索算法,它解决了边路径代价为非负的图的单源最短路径问题

所以你不能用Dijkstra的方法否定所有的边权重,你能做的就是否定所有的边权重,用Bellman-Ford算法-

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

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


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

据我所知,计算最长路径无法在多项式时间内完成。下面是最长路径算法的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;
}
公共类最长路径{
静态整数倍;
公共双初始最长路径(ArrayList V,顶点源){
对于(顶点u:V){
u、 设定值(假);
}
返回getLongestPath(源);
}
公共双getLongestPath(顶点v){
++时代;
系统输出打印项次;
双w,距离,最大值=0;
v、 setVisited(真);
对于(边e:v.GetOutgoingEdge()){
如果(!e.getToNode().isVisited()){
dist=e.getWeight()+getLongestPath(e.getToNode());
如果(距离>最大值)
最大值=距离;
}
}
v、 设定值(假);
返回最大值;
}

}

您是对的,但也给出了边在图中出现的概率……那么我如何在计算中使用概率呢?最短路径算法需要较少的边和较低的权重。最长路径算法需要许多低权重的长边。最短路径alg不会帮助您找到最长路径。如果我将每条边设为负数并运行最短路径算法,它可以给我想要的结果(因为最小化正值与最大化负值相同)…但您将如何使用p-“图中存在边的概率”在算法中,-1最短路径是指非负圈图(在P中)。那么P+NP?首先展示你们的证明,然后像你们所说的那个样快速地决定最短路径,对于非负循环的图,请看维基…假设只有正权重,BFS会很好地工作。他的解释指出,存在一些边出现的“可能性”,虽然严格来说,这不是一个合理的假设(只有正边),但存在一个简单的情况分裂:允许负循环->NP完全;或者不允许它们->使用修改过的(最短路径算法|图)。但您在太多情况下的假设会产生负循环,因此您当前的方法没有意义,而负循环的图在正常情况下也没有意义。但我认为可以使用DFS来代替BFS。我将在每个节点上运行DFS,至少在一个节点上,DFS将访问所有顶点。这将是图中最长的路径,对吗?但在这种方法中,我不知道在哪里可以使用概率。?最好的方法是回溯,事实上,在最坏的情况下,您应该访问所有可能的路径以找到答案。在运行此操作之前,您可以进行一些优化。对于每个节点,检查它是否只有两个连接。如果是,则删除该节点,在其连接到的节点之间创建一条等于连接到该节点的路径之和的边。您还可以删除一些只有一个连接的节点(将获取这些节点的成本添加到它们所连接的节点)。请注意,如果这样做,则最多只能数到两个,具体取决于开始/结束的位置