裸的弗洛伊德算法,题目中指定,再阐述一下思想;
弗洛伊德思想:
对于n个结点,如果该节点当其他任意两个结点i,j的中继,可以缩短i和j之间的距离,则进行更新;
采用三个循环更新,复杂度为O(n^3);
#include<iostream> #include<vector> #include<string> using namespace std; const int maxn = 210; const int INF = 10000000; int ma[maxn][maxn]; int n, m; int st, ed; void init() { fill(ma[0], ma[0] + maxn * maxn, INF); for (int i = 0; i < n; i++) { ma[i][i] = 0; } } void floyd() { for (int k = 0; k < n; k++) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (ma[i][k] != INF && ma[k][j] != INF && ma[i][k] + ma[k][j] < ma[i][j]) { ma[i][j] = ma[i][k] + ma[k][j]; } } } } } int main() { while (cin >> n >> m) { init(); int a, b, c; for (int i = 0; i < m; i++) { cin >> a >> b >> c; ma[a][b] = ma[b][a] = c; } cin >> st >> ed; floyd(); if (ma[st][ed] == INF) cout << -1 << endl; else cout << ma[st][ed] << endl; } }
原文:https://www.cnblogs.com/songlinxuan/p/12693025.html