91 求助
查看原帖
91 求助
482082
Mortis_Vampire楼主2021/12/7 20:45

Wa 了第 8 个点,下载下来是直接输出AFK

蒟蒻用的是 Dij ,麻烦大佬帮忙看看错。

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define int long long
using namespace std;
int n,m,b;
const int N = 1e4+5 , M = 2e5+5;
int h[N],ver[M],Next[M],edge[M],cnt;
int pd,p[N],dist[N],vst[N];
void Add(int x,int y,int z) {
	Next[++cnt]=h[x];
	ver[cnt]=y;
	edge[cnt]=z;
	h[x]=cnt;
}
void Dij() {
	queue<pair<int,int> >q;
	q.push(make_pair(0,1));
	for(int i=1;i<=n;i++)
	dist[i]=0x7fffffff;
	memset(vst,0,sizeof(vst));
	dist[1]=0;
	while(q.size()) {
		int u=q.front().second;
		q.pop();
		if(vst[u])continue;
		vst[u]=1;
		for(int i=h[u],v; i; i=Next[i]) {
			if(dist[v=ver[i]]>dist[u]+edge[i])
				if(p[v]<=pd) {
					dist[v]=dist[u]+edge[i];
					q.push(make_pair(-dist[v],v));
				}
		}
	}
}
bool check(int x) {
	pd=x;
	if(x<p[1]||x<p[n])return false;
	Dij();
	if(dist[n]>=b)return false;
	return true;
}
signed main() {
	scanf("%lld%lld%lld",&n,&m,&b);
	int maxx=0;
	for(int i=1; i<=n; i++){
		scanf("%lld",&p[i]);
		maxx=max(maxx,p[i]);
	}
	for(int i=1; i<=m; i++) {
		int x,y,z;
		scanf("%lld%lld%lld",&x,&y,&z);
		if(x==y) continue;
		Add(x,y,z);
		Add(y,x,z);
	}
	if(!check(maxx)) {
		puts("AFK");
		return 0;
	}
	int l=1,r=maxx;
	while(l<r) {
		int mid=(l+r)>>1;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	printf("%lld",r);
	return 0;
}
2021/12/7 20:45
加载中...