核心代码:
dp思想,通过中间点k一步一步刷新e[i][j]的值
for(int k=1;k<=n;k++)//这一层循环是通过前k个中转点刷新任意两点间最短路径
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(e[i][j]>e[i][k]+e[k][j])
{
e[i][j]=e[i][k]+e[k][j];
}
}
}
}
完整代码:
#include <iostream>
using namespace std;
int e[10][10];
int inf=99999;
int main ()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)e[i][j]=0;
else e[i][j]=inf;
}
}
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
e[a][b]=c;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(e[i][j]>e[i][k]+e[k][j])
{
e[i][j]=e[i][k]+e[k][j];
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",e[i][j]);
if(j==n)printf("\n");
}
}
return 0;
}
测试用例:
输入:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
输出:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
floyd warshall :能处理负权边,但不能判定处理负权回路的存在
本文介绍了一种解决所有顶点对最短路径问题的经典算法——Floyd-Warshall算法,并提供了完整的C++实现代码。该算法通过迭代地考虑每个可能的中间顶点来逐步更新任意两点间的最短路径,能够处理包含负权边的情况。
1248

被折叠的 条评论
为什么被折叠?



