算法理解:
我认为Floyd-Warshall算法的基本思想很简单,就是通过中间的节点来减少两个地方之间的距离,中间的节点可以是一个也可以是多个,当然只要从头遍历到最后肯定也就能得出两个地方之间的最短距离。
实际上就是通过三重循环最外层循环就是及经过点(让i到j点之间的距离通过k(1—n)点来不断减少。
路径之间的距离如图
算法核心的代码:
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(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<stdio.h>
int inf=99999999;
int e[200][200];
int main()
{
int n,m,i,j,k,t1,t2,t3;
scanf("%d %d",&n,&m);
//对组进行初始化
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
for(j=1; j<=m; j++){
scanf("%d %d %d", &t1,&t2,&t3);
e[t1][t2]=t3;
}
//Floyd核心算法
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(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(i=1; i<=n; i++)
for(j=1; j<=n; j++)
printf("%d ", e[i][j]);
printf("\n");
return 0;
}