WA,20pts,思路是对每一个边,求出其可通行的时间,然后放入优先队列,时间多一个log
代码:
#include<bits/stdc++.h>
#define Inf 1e9
using namespace std;
#define int long long
constexpr auto maxn = 1010;
int N, M, t[maxn], i, j, w, Q, x, y, ts, dis[maxn][maxn], top;
inline void upd(const int& t) {
for (int i = 0; i < N; ++i)
for (int j = i + 1; j < N; ++j)
dis[i][j] = min(dis[i][t] + dis[t][j], dis[i][j]),
dis[j][i] = dis[i][j];
}
priority_queue<pair<int, tuple<int, int, int>>> way;
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N >> M;
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
dis[i][j] = Inf;
for (int i = 0; i < N; ++i) cin >> t[i], dis[i][i] = 0;
while (M--) cin >> i >> j >> w, way.push({ -max(t[i],t[j]),{i,j,w} });
cin >> Q;
while (Q--) {
cin >> x >> y >> ts;
while (!way.empty() && (-way.top().first <= ts)) {
auto mate = way.top().second;
way.pop();
auto i = get<0>(mate), j = get<1>(mate), w = get<2>(mate);
dis[i][j] = dis[j][i] = w;
upd(i), upd(j);
}
if (t[x] > ts || t[y] > ts) cout << "-1\n";
else
cout << (dis[x][y] != Inf ? dis[x][y] : -1) << '\n';
}
}