数据结构可视化
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;
}
算法分析
复杂度
参考资料:图最短路径算法之弗洛伊德算法(Floyd)