90分代码求助
查看原帖
90分代码求助
1242139
yinmingyang01楼主2025/7/24 21:00
#include <bits/stdc++.h>
#define ll long long
#define pll pair<ll,ll>
#define f first
#define s second
using namespace std;
const ll N=1e4+10,inf=0x3f3f3f3f;
ll n,m,b,f[N],dis[N],u,v,w,cnt,l,r,mid,mi=9e18;
bool vis[N];
vector<pll> e[N];
priority_queue<pll,vector<pll>,greater<pll> >q;
bool dijcheck(ll mid){
	memset(dis,inf,sizeof dis);
	memset(vis,0,sizeof vis);
	while(!q.empty()) q.pop();
	q.push({0,1});
	while(!q.empty()){
		cnt=q.top().f,u=q.top().s;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(ll i=0;i<e[u].size();i++){
			v=e[u][i].s,w=e[u][i].f;
			if(dis[v]>=w+cnt&&f[v]<=mid){//有的点不可以走到
				dis[v]=w+cnt;
				q.push({w+cnt,v});
			}
		}
	}
	if(dis[n]<=b&&f[n]<=mid){//血量足够、消费更少
		return 1;
	}else{
		return 0;
	}
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>b;
	for(ll i=1;i<=n;i++){
		cin>>f[i];
	}
	for(ll i=1;i<=m;i++){
		cin>>u>>v>>w;
		e[u].push_back({w,v});
		e[v].push_back({w,u});
	}
	l=f[1]-1,r=1e9;
	while(l<=r){
		mid=l+r>>1;
		if(dijcheck(mid)){
			mi=min(mi,mid);
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	if(mi==9e18){
		cout<<"AFK";
	}else{
		cout<<mid;
	}
	return 0;
}
2025/7/24 21:00
加载中...