wa on #9 #11,90分求调
查看原帖
wa on #9 #11,90分求调
472975
free_man楼主2024/7/28 10:44
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
#define int long long

const int N = 1000010;
int n, m, b;
int f[N], dis[N];
int e[N], ne[N], h[N], idx, w[N];
bool vis[N];

void add(int a, int b, int x) {
	e[idx] = b;
	w[idx] = x;
	ne[idx] = h[a];
	h[a] = idx++;
}

int dijkstra(int k) {
	if (k < f[1]) return -1;
	memset(dis, 0x7f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	dis[1] = 0;
	priority_queue<PII, vector<PII>, greater<PII> > hp;
	hp.push({0, 1});
	while (!hp.empty()) {
		// cout << hp.size() << endl;
		auto t = hp.top();
		hp.pop();
		int ver = t.second, d = t.first;
		if (vis[ver]) continue;
		vis[ver] = true;
		for (int i = h[ver]; i != -1; i = ne[i]) {
			int j = e[i];
			// cout << j << endl;
			if (f[j] > k) continue;
			if (dis[j] > d + w[i] && !vis[j]) {
				dis[j] = d + w[i];
				hp.push({dis[j], j});
			}
		}
	}
	// cout << 'd' << endl;
	if (dis[n] == 0x7f7f7f7f) return -1;
	return dis[n];
}

signed main() {
	scanf("%lld%lld%lld", &n, &m, &b);
	for (int i = 1; i <= n; i++)
		scanf("%lld", &f[i]);
	memset(h, -1, sizeof(h));
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		scanf("%lld%lld%lld", &x, &y, &z);
		if (x != y) {
			add(x, y, z);
			add(y, x, z);
		}
	}

	if (dijkstra(1e9) == -1) {
		printf("AFK\n");
		return 0;
	}
	int l = 0, r = 1e9;
	LL distance;
	while (l < r) {
		int mid = (l + r) >> 1;
		distance = dijkstra(mid);
		if (distance != -1 && distance <= b) r = mid;
		else l = mid + 1;
	}

	if (distance > b) {
		printf("AFK\n");
	} else {
		printf("%lld\n", l);
	}

	return 0;
}
2024/7/28 10:44
加载中...