玄关求调,必关
查看原帖
玄关求调,必关
625671
Zmk2009楼主2025/6/23 17:34
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 5;
inline bool isdig(char c){return '0' <= c && c <= '9';}
inline ll read(){
	ll x = 0 ,f = 1;
	char c = getchar();
	while (!isdig(c)){
		if (c == '-') f = -1;
		c = getchar();
	}
	while(isdig(c)){
		x = (x << 3) + (x << 1) + c - '0';
		c = getchar();
	}
	return x * f;
}
inline void write(ll x){
	if (x < 0){
		x = -x;
		putchar('-');
	}
	if (x >= 10) write(x / 10);
	putchar(x % 10 + '0');
}
ll a[N],c[N];
struct Node{
	ll v , val;
	Node(){}
	Node(ll v , ll val):v(v),val(val){}
	bool operator < (const Node & A) const{
		return val > A.val;
	};
};
struct Edge{
	ll u , v , w;
	Edge(){}
	Edge(ll u , ll v , ll w):u(u),v(v),w(w){}
};
ll b;
vector <Edge> e;
priority_queue <Node> q;
vector <Node> G[N];
bool vis[N];
ll dis[N], fl;
bool Dijkstra(ll s,ll n,ll x){
	for (int i = 1 ; i <= n ; i ++) dis[i] = 0x3f3f3f3f3f3f3f3f , vis[i] = 0;
	while (!q.empty()) q.pop();
	dis[s] = 0ll;
	vis[s] = 1;
	q.push(Node(s , 0ll));
	// cout << x << endl;
	while (!q.empty()){
		Node t = q.top();q.pop();
		ll u = t.v;
		if (dis[u] > b) continue;
		for (int i = 0 ; i < G[u].size() ; i ++){
			ll v = G[u][i].v , w = G[u][i].val;
			// cout <<u << " " <<  v << " " << w << " " << dis[u] + w << ' ' << dis[v] << endl;
			if (c[v] > x) continue;
			if (dis[u] + w < dis[v]){
				dis[v] = dis[u] + w;
				if (!vis[v]) {
					q.push(Node(v , dis[v]));
					vis[v] = 1;
				}
			}
		}
	}
	if (dis[n] == 0x3f3f3f3f3f3f3f3f) return false;
	return true;
}
bool check(ll x,ll n){return Dijkstra(1 , n , x);}
int main(){
	ll n = read() , m = read();
	b = read();
	for (int i = 1 ; i <= n ;i ++) a[i] = read(),c[i] = a[i];
	for (int i = 1 ; i <= m ; i ++){
		ll u = read() , v = read() , w = read();
		G[u].push_back(Node(v , w));
		G[v].push_back(Node(u , w));
	}
	sort(a + 1 , a + n + 1);
	ll l = 1 , r = n,ans = -1;
	while (l <= r){
		int mid = l + r >> 1;
		if (check(a[mid] , n)) ans = a[mid] , r = mid - 1;
		else l = mid + 1;
	}
	if (ans == -1) return puts("AFK"),0;
	write(max(c[1],ans));
	putchar('\n');
	return 0;
}

2025/6/23 17:34
加载中...