Floyd-warshall为无向图的最长距离

时间:2017-02-28 04:15:20

标签: algorithm graph floyd-warshall undirected-graph longest-path

我想使用Floyd-warshall算法找到加权无向图的任意两个顶点之间的最大距离。为此,我做了一些改动:

  1. 我添加负重而不是正数。

  2. 然后我找到了最短路径。

  3. 但它没有给我正确的输出。有人可以指出我正在犯的错误。

    class TestClass {
        public static void main(String args[] ) throws Exception {
            Scanner sc = new Scanner(System.in);
            int testcases=sc.nextInt();
            for(int t=0;t<testcases;t++)
            {
                int nodes=sc.nextInt();
                int edges=sc.nextInt();
                int[][] dist_mat=new int[nodes][nodes];
                for(int i=0;i<nodes;i++)
                {
                    for(int j=0;j<nodes;j++)
                    {
                        if(i!=j)
                        {
                            dist_mat[i][j]=Integer.MAX_VALUE;
                        }
                    }
                }
                for(int i=0;i<edges;i++)
                {
                    int source=sc.nextInt();
                    int dest=sc.nextInt();
                    dist_mat[source-1][dest-1]=-sc.nextInt();
                    dist_mat[dest-1][source-1]=dist_mat[source-1][dest-1];
                }
    
                for(int k=0;k<nodes;k++)
                {
                    for(int i=0;i<nodes;i++)
                    {
                        for(int j=0;j<nodes;j++)
                        {
    
                            if(i!=j && j!=k && i!=k && dist_mat[i][j]>dist_mat[i][k]+dist_mat[k][j])
                            {
                                if(dist_mat[i][k]<Integer.MAX_VALUE && dist_mat[k][j]<Integer.MAX_VALUE)
                                        dist_mat[i][j]=Integer.min(dist_mat[i][j],dist_mat[i][k]+dist_mat[k][j]);
                                if(dist_mat[j][k]<Integer.MAX_VALUE && dist_mat[k][i]<Integer.MAX_VALUE)
                                        dist_mat[j][i]=Integer.min(dist_mat[j][i],dist_mat[j][k]+dist_mat[k][i]);
                            }
    
                        }
                    }
                }   
            }
        }
    

    相同的输入是: -

    1 [测试用例数]

    5 4 [节点数,边数]

    1 2 4 [第一个节点,第二个节点,重量]

    3 2 3 [第一个节点,第二个节点,重量]

    2 5 2 [第一个节点,第二个节点,重量]

    4 1 1 [第一个节点,第二个节点,重量]

2 个答案:

答案 0 :(得分:0)

能够在任意两个节点之间找到最长路径的算法可用于确定Hamiltonian path问题。但是,汉密尔顿路径问题是NP-complete。 Floyd-Warshall算法产生一个多项式运行时绑定,因此修改将导致一个确定最长路径的算法是不可靠的。

答案 1 :(得分:0)

弗洛伊德·瓦尔沙尔应该工作。首先请注意,当人们谈论最长距离问题及其NP硬度时会感到困惑。

来自此link

  

请注意,当我们谈论最长的时   路径:

     

最长路径问题通常意味着找到最长的简单   路径。然而,最短路径问题集中在   找到最短的(简单或非简单)路径的方法。

如果原始图method没有正周期,那么G(通过排除边从G生成的图)将没有负边,您可以使用Floyd-Warshall来在-G中找到最短路径,因此在-G中找到最长路径。因此,如果您的输入图没有正周期,则Floyd-Warshall应该起作用。另请参见here

您的代码可能存在的一个问题是,您将所有距离初始化为一个MAX值:G,而我认为在Floyd-Warshall中,您应该将它们初始化为图形的边缘权重。