求救大佬,只有30分
查看原帖
求救大佬,只有30分
422387
VIOLET__FOREVER楼主2022/6/28 14:07
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
ll x,y,z,n,m,b,l,r,mid,ans=1e9+10,v[100005];
struct node{
	ll to,next,value;
}edgn[100005];
ll head[100005],tot,dist[100005];
bool be[100005];
void add(int x,int y,int v){
	tot++;
	edgn[tot].to=y;
	edgn[tot].value=v;
	edgn[tot].next=head[x];
	head[x]=tot;
}
bool di(int flag){
	for(int i=2;i<=n;i++){
		dist[i]=0x3f3f3f3f;
		be[i]=0; 
	}
	be[1]=0;
	priority_queue<PII,vector<PII>,greater<PII> > heap;
	heap.push({0,1});
	while(!heap.empty()){
		PII w=heap.top();
		heap.pop();
		int ver=w.second;
		if(be[ver]) continue;
		be[ver]=1;
		for(int i=head[ver];i!=0;i=edgn[i].next){
			int x=edgn[i].to;
			if(v[x]<=flag && dist[x]>dist[ver]+edgn[i].value){
				dist[x]=dist[ver]+edgn[i].value;
				heap.push({dist[x],x});
			}
		}
	}
	if(dist[n]>b) return 0;
	else return 1;
}
int main(){
	cin>>n>>m>>b;
	for(int i=1;i<=n;i++) cin>>v[i];
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	sort(v+1,v+1+n);
	l=1,r=n;
	while(l<=r){
		mid=(l+r)>>1;
		if(di(v[mid])){
			ans=v[mid];
			r=mid-1;
		}
		else l=mid+1;
	}
	if(ans==1e9+10){
		cout<<"AFK";
		return 0;
	}
	cout<<ans;
	return 0;
} 
2022/6/28 14:07
加载中...