【问题标题】:Floyd-warshall for longest distance for undirected graphFloyd-warshall 用于无向图的最长距离
【发布时间】:2025-12-30 14:50:16
【问题描述】:

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

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

  2. 然后我找出最短路径。

但它没有给我正确的输出。谁能指出我犯的错误。

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 [第一个节点,第二个节点,权重]

【问题讨论】:

  • Floyd-Warshall 算法是一种用于在加权图中查找 最短 路径(不是“最长距离”)的算法。你想在这里做什么?
  • 我不认为你可以调整 FW 来计算最大距离。事实上,在循环的情况下,最大距离可能是无限的。

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


【解决方案1】:

Floyd-Warshal 应该可以工作。首先请注意,当人们谈论最长距离问题及其 NP-hardness 时存在混淆。

来自link

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

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

如果原始图G 没有正循环,那么-G(通过对 G 的边求反创建的图)将没有负边,您可以使用 Floyd-Warshall 找到最短路径在-G 中,因此是G 中最长的路径。因此,如果您的输入图没有正循环,Floyd-Warshall 应该可以工作。另见here

您的代码的一个可能问题是您将所有距离初始化为 MAX 值:dist_mat[i][j]=Integer.MAX_VALUE,而我认为在 Floyd-Warshall 中您应该将它们初始化为图形的边权重。

【讨论】:

    【解决方案2】:

    一种能够找到任意两个节点之间最长路径的算法可用于决定Hamiltonian path 问题。然而,哈密顿路径问题是NP-complete。 Floyd-Warshall 算法产生多项式运行时界限,因此修改不太可能导致确定最长路径的算法。

    【讨论】:

    • 该图不包含负循环。我试图说明的一点是,我们不能在正权重的情况下使用负权重(假设所有边权重都是正的),然后找出最短路径,这将为我们提供反转符号的最长路径。如果不可能,有人可以解释为什么吗?上述示例和测试用例应该可以工作。