项湫

导航

Floyd算法求解下图各个顶点的最短距离

1. 问题

Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)。

2. 解析

第一、先找出最短的距离
第二、然后在考虑如何找出对应的行进路线。
  如何找出最短路径呢,这里还是用到动态规划的知识,对于任何一个城市而言,i到j的最短距离不外乎存在经过i与j之间经过k和不经过k两种可能,所以可以令k=1,2,3,...,n(n是城市的数目),在检查d(ij)与d(ik)+d(kj)的值;在此d(ik)与d(kj)分别是目前为止所知道的i到k与k到j的最短距离,因此d(ik)+d(kj)就是i到j经过k的最短距离。所以,若有d(ij)>d(ik)+d(kj),就表示从i出发经过k再到j的距离要比原来的i到j距离短,自然把i到j的d(ij)重写为d(ik)+d(kj),每当一个k查完了,d(ij)就是目前的i到j的最短距离。重复这一过程,最后当查完所有的k时,d(ij)里面存放的就是i到j之间的最短距离了。

 

3. 设计

for(k=1;k<=n;k++)

        for(i=1;i<=n;i++)

            for(j=1;j<=n;j++) {

                if(d[i][k]+d[k][j]<d[i][j]) {

                    d[i][j]=d[i][k]+d[k][j];

                    dis[i][j]=dis[i][k];

                }

            }

4. 分析

复杂度为O(n^3),因为一共三重循环

5. 源码

#pragma warning(disable:4996)

#define _CRT_SECURE_NO_WARNINGS

 

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

const int N = 210, INF = 1e9;

int n, m, k, d[N][N];

void floyd() {

    for (int k = 1; k <= n; k++)

        for (int i = 1; i <= n; i++)

            for (int j = 1; j <= n; j++)

                d[i][j] = min(d[i][j], d[i][k] + d[k][j]);

}

int main(void) {

    cin >> n >> m >> k;

    for (int i = 1; i <= n; i++)

        for (int j = 1; j <= n; j++) {

            if (i == j)d[i][j] = 0;

            else d[i][j] = INF;

        }

    for (int i = 0, a, b, c; i < m; i++) {

        cin >> a >> b >> c;

        d[a][b] = min(d[a][b], c);

    }

    floyd();

    for (int i = 0, x, y; i < k; i++) {

        cin >> x >> y;

        if (d[x][y] > INF / 2)cout << "impossible" << endl;

        else cout << d[x][y] << endl;

    }

    return 0;

}

posted on 2021-03-17 20:10  项湫  阅读(102)  评论(0编辑  收藏  举报