80分求助
查看原帖
80分求助
809371
Love_Natsu楼主2024/1/20 21:21

#5 #8 和hack点没过 感谢好人~

#include<bits/stdc++.h>
#define N 100005
using namespace std;
struct node{
    int point,dist;
    bool operator > (const node &A) const{return dist>A.dist;};
};
struct edge{int v,w;};
int n,m,s=1,b,u,v,w,dis[N],cost[N],h;
vector<edge> vt[N];
bool vis[N];
priority_queue<node,vector<node>,greater<node> >q;
bool dij(int wt){
	if(cost[1]>wt)return false;
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	q.push({s,0});
	dis[s]=0;
	while(!q.empty()){
		u=q.top().point ; q.pop();
		if(vis[u])continue;
		vis[u]=1;
		if(cost[u]>wt)continue;
		for(int i=0;i<vt[u].size();i++){
			v=vt[u][i].v,w=vt[u][i].w;
			if(cost[v]>wt)continue;
			if(b>dis[u]+w){
				dis[v]=dis[u]+w;
				q.push({v,dis[v]});
			}
		}
	}
	if(dis[n]<=b)return true;
	return false;
}
int main(){
    ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>b;
	for(int i=1;i<=n;i++){
		cin>>cost[i];h=max(h,cost[i]);
	}
	while (m--){
		cin>>u>>v>>w;
		vt[u].push_back({v,w});
	}
	if(!dij(h))cout<<"AFK";
	else{
		int l=0,r=h,mid,ans;
		while(l<=r){
			mid=l+(r-l)/2;
			if(dij(mid))ans=mid,r=mid-1;
			else l=mid+1;
		}
		cout<<ans;
	}
	return 0;
}
2024/1/20 21:21
加载中...