图论知识之最短路算法——Floyd算法
作者:互联网
Floyd算法是最短路算法中唯一可以求多源最短路的算法,但它的时间复杂度较高,是O(n3)。Floyd算法也采用了松弛操作,对在所有i和j之间的其他点进行一次松弛,这样就需要三重for循环,并且for循环的内部采用了一个if语句,含义是对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短,如果是则更新它。
Floyd算法其实没啥可说的,理解了三重for循环基本就可以理解Floyd算法的原理了,直接上代码:
#include <algorithm> #include <cstring> #include <iostream> using namespace std; const int N = 210, INF = 1e9; int n, m, Q; int 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() { cin >> n >> m >> Q; 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; } } } while (m--) { int a, b, c; cin >> a >> b >> c; d[a][b] = min(d[a][b], c); } floyd(); while (Q--) { int a, b; cin >> a >> b; int t = d[a][b]; if (t > INF / 2) { cout << "impossible" << endl; } else { cout << t << endl; } } return 0; }
标签:图论,int,短路,floyd,算法,Floyd,include 来源: https://www.cnblogs.com/YZYc/p/Floyd-Class-YPPAH.html