Floyd
Complexity¶
Time Complexity: \(O(n^3)\)
Space Complexity: \(O(n^2)\)
Floyd
void floyd(int dis[][], int sz) {
for (int k=1; i<=sz; ++i) {
for (int x=1; x<=sz; ++x) {
for (int y=1; y<=sz; ++y) {
dis[x][y] = min(dis[x][y], dis[x][k] + dis[k][y]);
}
}
}
}
Problems¶
Luogu P119 灾后重建¶
Solution
#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int maxn = 202;
const int maxm = 20000;
const int inf = 0x3f3f3f3f;
int n, m;
vector< vector<int> > adj(maxn, vector<int>(maxn, inf));
vector<int> t(maxn, 0);
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i=0; i<n; ++i) {
adj[i][i] = 0;
}
for (int i=0; i<n; ++i) {
cin >> t[i];
} for (int i=0; i<m; ++i) {
int x, y, z;
cin >> x >> y >> z;
adj[x][y] = adj[y][x] = z;
}
int Q; cin >> Q;
int last = 0; // last accessed time
while (Q--) {
int x, y, z;
cin >> x >> y >> z;
if (t[x] > z || t[y] > z) {cout << -1 << endl; continue;}
while (last < n && t[last] <= z) {
// Floyd
for (int i=0; i<n; ++i) {
for (int j=0; j<n; ++j) {
adj[i][j] = min(adj[i][j], adj[i][last] + adj[last][j]);
}
}
++last;
}
cout << (adj[x][y] == inf ? -1 : adj[x][y]) << endl;
}
}