30pts求救
查看原帖
30pts求救
235786
Alone0213楼主2022/10/2 19:31

T了#2#3#6#8#9#10,WA了#7看着第二篇题解的思路写的,求调,dij+二分

#include<bits/stdc++.h>
using namespace std;
const int M=5e4+986;
const int N=1e4+576;
const int MV=1e9;
int n,m,b;
struct node{
	int ne,to,w;
}g[M];int cnt;
int h[N];
int fe[N];
int o,p,tr;
int dis[N],vis[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;

void add(int s,int t,int val){
	g[++cnt].ne=h[s];
	g[cnt].to=t;
	g[cnt].w=val;
	h[s]=cnt;
}

bool dijkstra(int x){
	if(fe[1]>x) return 0;
	for(int i=1; i<=n; i++){
		dis[i]=0x7fffffff;
		vis[i]=0;
	}
	dis[1]=0;
	q.push(make_pair(dis[1],1));
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(!vis[u]){
			vis[u]=1;
			for(int i=h[u]; i; i=g[i].ne){
				int v=g[i].to;
				if(dis[v]>dis[u]+g[i].w&&fe[v]<=x){
					dis[v]=dis[u]+g[i].w;
					q.push(make_pair(dis[v],v));
				}
			}
		}
	}
	if(dis[n]>b) return 0;
	return 1;
}
signed main(){
	scanf("%d%d%d",&n,&m,&b);
	for(int i=1; i<=n; i++) scanf("%d",&fe[i]);
	for(int i=1; i<=m; i++){
		scanf("%d%d%d",&o,&p,&tr);
		add(o,p,tr);
		add(p,o,tr);
	}
	if(!dijkstra(MV)) return 0&printf("AFK");
	int l=1,r=MV,mid=(l+r)>>1;
	while(l<=r){
		bool whe=dijkstra(mid);
		if(whe){
			r=mid-1;
			mid=(l+r)>>1;
		}else{
			l=mid+1;
			mid=(l+r)>>1;
		}
	}
	printf("%d",l);
	return 0;
}
2022/10/2 19:31
加载中...