二分最短路70pts求条
查看原帖
二分最短路70pts求条
540956
douweiqi楼主2024/7/29 09:31

玄1关

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
const long long N=1e6+10;
const long long M=1e3+10;

long long n,m,b;
long long f[N];
long long maxuse=-0x7fffffff;
struct Node{
	long long next;
	long long to;
	long long w;//损失血量 
}e[N];
long long head[N];
void init(){
	cin>>n>>m>>b;
	for(long long i=1;i<=n;i++){
		cin>>f[i];
		maxuse=max(maxuse,f[i]);
	}
	long long cnt=0;
	for(long long i=1;i<=m;i++){
		long long u,v,w;
		cin>>u>>v>>w;
		e[++cnt].next=head[u];
		head[u]=cnt;
		e[cnt].to=v;
		e[cnt].w=w;
		e[++cnt].next=head[v];
		head[v]=cnt;
		e[cnt].to=u;
		e[cnt].w=w;
	}
}
queue<long long> que;
long long pd[N];
long long dis1[N];
long long dis2[N];
map<int,int> to1;
map<int,int> to2;
//long long to1[N];
//long long to2[N];
void spfa1(long long start){
	long long k=start;
	for(long long i=1;i<=n;i++){
		dis1[i]=0x7fffffff;
		//pd[i]=false;
	}
	dis1[k]=0;
	pd[k]=true;
	que.push(k);
	while(!que.empty()){
		k=que.front();
		que.pop();
		pd[k]=false;
		for(long long i=head[k];i;i=e[i].next){
			if(dis1[e[i].to]>dis1[k]+e[i].w){
				dis1[e[i].to]=dis1[k]+e[i].w;
				to1[e[i].to]=k;
				if(!pd[e[i].to]){
					que.push(e[i].to);
					pd[e[i].to]=true;
				}
			}
		}
	}
}
void spfa2(long long start){
	long long k=start;
	for(long long i=1;i<=n;i++){
		dis2[i]=0x7fffffff;
		pd[i]=false;
	}
	dis2[k]=0;
	pd[k]=true;
	que.push(k);
	while(!que.empty()){
		k=que.front();
		que.pop();
		pd[k]=false;
		for(long long i=head[k];i;i=e[i].next){
			if(dis2[e[i].to]>dis2[k]+e[i].w){
				dis2[e[i].to]=dis2[k]+e[i].w;
				to2[e[i].to]=k;
				if(!pd[e[i].to]){
					que.push(e[i].to);
					pd[e[i].to]=true;
				}
			}
		}
	}
}
long long find_road_max(long long begin,long long end,long long li){
	long long maxx=-0x7fffffff;
	long long k;
	if(li==1){
		maxx=max(maxx,f[begin]);
		k=end;
		while(k!=0){
			maxx=max(maxx,f[k]);
			k=to1[k];
		}
	}
	if(li==2){
		maxx=max(maxx,f[begin]);
		k=end;
		while(k!=0){
			maxx=max(maxx,f[k]);
			k=to2[k];
		}
	}
	return maxx;
}
bool check(long long k){
	for(long long i=1;i<=n;i++){
		if(find_road_max(1,i,1)<=k&&find_road_max(i,n,2)<=k){
			return true;
		}
	}
	return false;
}
int main(){
	init();
	spfa1(1);
	spfa2(n);
	if(dis1[n]>b){
		cout<<"AFK";
		return 0;
	}
	long long l=0,r=maxuse;
	long long mid;//二分最小花费 
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)){
			r=mid-1;
		}else{
			l=mid+1;
		}
	}
	cout<<mid;
	return 0;
}
2024/7/29 09:31
加载中...