P1119 灾后重建(只求结果是对的,不管TLE
  • 板块学术版
  • 楼主ElmPoplar
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/7/9 23:24
  • 上次更新2023/10/27 21:17:54
查看原帖
P1119 灾后重建(只求结果是对的,不管TLE
371524
ElmPoplar楼主2022/7/9 23:24
#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;
}

long long dis[N];
bool ver[N];

long long dijkstra(int s, int e, int k) {
	priority_queue<pair<long long, int>, vector<pair<long long, int> >, greater<pair<long long, 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);

		printf("%lld\n", dijkstra(x, y, z));
	}

	return 0;
}
2022/7/9 23:24
加载中...