机试真题 弗洛伊德算法
裸的弗洛伊德算法,题目中指定,再阐述一下思想;
弗洛伊德思想:
对于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;
}
}

浙公网安备 33010602011771号