最短路程:Floyd——warshall
两点之间的最短路径可以用n*n的深度探索或广度优先搜索;
也可通过k点作为中转点,让两个点链接起来
1 | 2 | 3 | 4 | |
---|---|---|---|---|
1 | 0 | 2 | 6 | 4 |
2 | inf | 0 | 3 | inf |
3 | 7 | inf | 0 | 1 |
4 | 5 | inf | 12 | 0 |
表格表示:
1点到2点路程为2,到3为6,到4为4;
inf表定义的无穷数;0表示自己到自己(无意义的操作)
假设现在只让1点作为中转点时的表格:
1 | 2 | 3 | 4 | |
---|---|---|---|---|
1 | 0 | 2 | 6 | 4 |
2 | inf | 0 | 3 | inf |
3 | 7 | 9 | 0 | 1 |
4 | 5 | 7 | 11 | 0 |
代码实现如下:
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]>a[i][1]+a[1][j])
a[i][j]=a[i][1]+a[1][j];
}
}
所有点都依次作为中转点的结果:
1 | 2 | 3 | 4 | |
---|---|---|---|---|
1 | 0 | 2 | 5 | 4 |
2 | 9 | 0 | 3 | 4 |
3 | 6 | 8 | 0 | 1 |
4 | 5 | 7 | 10 | 0 |
核心代码如下:
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]>a[i][1]+a[1][j])
a[i][j]=a[i][1]+a[1][j];