枚举边是否可行
查看原帖
枚举边是否可行
515990
Editzed楼主2022/8/9 18:17

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';
	}
}
2022/8/9 18:17
加载中...