30分AC+WA求调
查看原帖
30分AC+WA求调
1020005
c20220525楼主2023/12/15 19:41

迪杰斯特拉,但是check和dij是分开来写的,看dalao们都是放一起的qwq

#include <bits/stdc++.h>
#define int long long
#define rg register
using namespace std;
int n,m,b,f[10005],dis[10005],obs[10005],ans,l,r;
bool vis[10005];
struct aa{
	int b,v;
};
vector<aa> v[10005]; 
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
inline void dijkstra(){
	q.push({0,1});
	vis[1]=1;
	dis[1]=0;
	while(!q.empty()){
		int a=q.top().first,b=q.top().second;//a距离 b点
		q.pop();
		for(rg int i = 0; i < v[b].size(); i++ ){
			int bb=v[b][i].b,vv=v[b][i].v;
			if(vis[bb]) continue;
			vis[bb]=1;
			if(dis[bb]>dis[b]+vv){
				dis[bb]=dis[b]+vv;
				q.push({dis[bb],bb});
			} 
		} 
	}
}
queue<int> qq;
inline bool check(int x){
	if(x<f[1]) return false;
	int _max=f[1];
	qq.push(1);
	vis[1]=1;
	while(!qq.empty()){
		int now=qq.front();
		qq.pop();
		for(rg int i = 0; i < v[now].size(); i++ ){
			int b=v[now][i].b,a=v[now][i].v;
			if(!vis[b]&&!obs[b]){
				vis[b]=1;
				qq.push(b);
				_max=max(_max,f[b]);
			}
		}
	}
	return _max<=x;
}
signed main(){
	memset(dis,63,sizeof(dis));
	scanf("%lld%lld%lld",&n,&m,&b);
	for(rg int i = 1; i <= n; i++ ){
		scanf("%lld",f+i);
		
		r=max(r,f[i]);
	}
	l=max(f[1],f[n]);
	for(rg int i = 0; i < m; i++ ){
		int a,b,c;
		scanf("%lld%lld%lld",&a,&b,&c);
		v[a].push_back({b,c});
		v[b].push_back({a,c});
	}
	dijkstra();
	if(dis[n]>b){
		printf("AFK");
		return 0;
	}
	for(rg int i = 1; i <= n; i++ ){
		if(dis[i]>b) obs[i]=1;
	}
	while(l<=r){
		int mid=(l+r)>>1;
		memset(vis,0,sizeof(vis));
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else{
			l=mid+1;
		}
	}
	printf("%lld",ans);
	return 0;
}
2023/12/15 19:41
加载中...