不求过TLE,只想代码是对的
查看原帖
不求过TLE,只想代码是对的
371524
ElmPoplar楼主2022/7/9 08:10
#include <bits/stdc++.h>
using namespace std;
const int N = 205, M = 40005;
int n, m, q, t[N];

struct Edge {
	int to, next, w;
	Edge() {to = next = w = -1;}
}g[M];

int cnt = 0, head[N];

void add(int u, int v, int w) {
	g[++ cnt].next = head[u];
	g[cnt].to = v;
	g[cnt].w = w;
	head[u] = cnt;
}

int dis[N], ver[N];

int dijkstra(int s, int e, int k) {
	priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > h;
	memset(dis, 0x3f, sizeof dis);
	memset(ver, 0, sizeof ver);
	dis[s] = 0;

	h.push({dis[s], s});

	while (! h.empty()) {
		int d = h.top().second;
		h.pop();

		if (ver[d])
			continue;

		for (int i = head[d]; ~ i; i = g[i].next) {
			int j = g[i].to;

			if ((dis[j] > dis[d] + g[i].w) && k >= t[j]) {
				dis[j] = dis[d] + g[i].w;

				h.push({dis[j], j});
			}
		}

		ver[d] = 1;
	}

	if (dis[e] == 0x3f3f3f3f)
		return -1;
	else
		return dis[e];
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i ++)
		scanf("%d", &t[i]);
	for (int i = 1; i <= m; i ++) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);

		add(u, v, w);
		add(v, u, w);
	}

	scanf("%d", &q);
	while (q --) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);

		if (t[x] > z || t[y] > z)
			printf("-1\n");
		else
			printf("%d\n", dijkstra(x, y, z));
	}

	return 0;
}
2022/7/9 08:10
加载中...