多源最短路

数据结构可视化

Floyed

算法简介

  • 思想:动态规划
  • 适用对象:不存在负权重回路图
  • 解决的问题:求图中任意两点间的最短距离

算法学习

逻辑:Distance(s, e)最小值的取得: 1.直接相连 2.通过中间点。Floyed算法遍历图中所有节点作为中间点进行松弛(relax)操作:中间点p,起始点s,终点e if Distance(s, e) > Distance(s, p) + Distance(p, e) then Distance(s, e) = Distance(s, p) + Distance(p, e)

伪代码

G :graph
V(G) :vertexs list for G
p :passing point  
s :starting point
e :ending point  

for p in V(G):
    for s in V(G):
        for e in V(G):
            relax; 

C++ demo

#include <bits/stdc++.h>
using namespace std;

void Floyed(vector<vector<int>>& matrix, int m, int n) {
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][k] + matrix[k][j] < matrix[i][j]) {
                    matrix[i][j] = matrix[i][k] + matrix[k][j];
                }
            }
        }    
    }
}

int main() {
    int m = 10, n = 5;
    vector<vector<int>> matrix(m, vector<int>(n));
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            matrix[i][j] = rand() % 1000;
        }
    }
    Floyed(matrix, m, n);
    return 0;
}  

算法分析

复杂度

  • 时间 O(n3)
  • 空间 O(n2)

参考资料:图最短路径算法之弗洛伊德算法(Floyd)

posted @ 2024-11-12 11:17  luvmis  阅读(34)  评论(0)    收藏  举报