【发布时间】:2025-12-30 14:50:16
【问题描述】:
我想使用 Floyd-warshall 算法找到加权无向图的任意两个顶点之间的最大距离。为此,我做了一些更改:
我添加负权重而不是正数。
然后我找出最短路径。
但它没有给我正确的输出。谁能指出我犯的错误。
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