图论算法(五) Floyd算法

简介

Floyd算法的作用是求出一个图之间任意两点的最短距离,被认为是一个经典的动态规划算法——然而我至今仍然没搞明白动态规划到底是什么意思2333……

原理

从任意节点i到任意节点j的最短路径不外乎2种可能——要么是直接从i到j,要么是从i经过若干个节点k到j。

所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离(这里用邻接矩阵表示图):

对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立——证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。


一个实例

https://pta.patest.cn/pta/test/558/exam/4/question/9929

代码

#include 
#include 
#include 
#define INF 65536
using namespace std;
class Graph {
private:
    int n;
    vector> matrix;
public:
    Graph(int N) {
        n = N;
        vector>_matrix(n, vector(n, INF));
        matrix = _matrix;
    }
    ~Graph() {
        
    }
    void build(int m) {
        int a, b, weight;
        for (int i = 0; i < m; i++)
        {
            cin >> a >> b >> weight;
            matrix[a - 1][b - 1] = weight;
            matrix[b - 1][a - 1] = weight;
            //注意数组下标从0开始计数
        }
    }
    void Floyd() {//Floyd算法
        for (int k= 0;k maxDist) {//注意不要计算自己到自己的距离
                maxDist = matrix[vertex][i];
            }
        }
        return maxDist;
    }
};
int main()
{
    int N, M;
    cin >> N >> M;
    Graph graph(N);
    graph.build(M);
    graph.Floyd();
    int animal = 0;
    int miniDist = INF;
    int check = graph.findMaxDist(3);
    for (int i = 0; i < N; i++)
    {
        auto dist = graph.findMaxDist(i);
        //类型自动推导fromCpp_11,我也来装个逼23333
        if (dist>=INF)
        {
            cout << 0 << endl;
            return 0;
            //自动退出?非连通集?
        }
        if (miniDist>dist) //如果当前找到的距离最小则更新miniDist
        {
            animal = i + 1;//还是从0开始的问题
            miniDist = dist;
        }
    }
    cout << animal << " " << miniDist << endl;
    return 0;
}

你可能感兴趣的:(图论算法(五) Floyd算法)