二分+迪杰斯特拉瞎写不过样例求调
查看原帖
二分+迪杰斯特拉瞎写不过样例求调
530180
KingPowers楼主2022/7/12 07:09
#include<bits/stdc++.h>
#define M 100005<<1
#define PII pair<int,int>
#define int long long
using namespace std;
struct edge
{
	int nxt,to,val;
	edge(int _nxt=0,int _to=0,int _val=0){nxt=_nxt,to=_to,val=_val;}
}e[M];
int f[M],dis[M],head[M],cnt,n,m,b,l,r,ans=-1;
bool vis[M];
void add(int u,int v,int w)
{
	e[++cnt]=edge(head[u],v,w);
	head[u]=cnt;
}
bool check(int x)
{
	if(x<f[1]) return 0;
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	priority_queue<PII>q;
	q.push(make_pair(0,1));
	while(q.size())
	{
		PII top=q.top();
		q.pop();
		int d=-top.first,p=top.second;
		if(vis[p]) continue;
		vis[p]=1;
		for(int i=head[p];i;i=e[i].nxt)
		{
			int to=e[i].to,val=e[i].val,newd=dis[p]+val;
			if(dis[to]>newd&&f[to]<=x)
			{
				dis[to]=newd;
				q.push(make_pair(-newd,to));
			}
		}
	}
	//printf("dis[n]:%lld\n",dis[n]);
	if(dis[n]<=b) return 1;
	else return 0;
}
signed main()
{
	scanf("%lld%lld%lld",&n,&m,&b);
	for(int i=1;i<=n;i++) scanf("%lld",&f[i]);
	for(int i=1,u,v,w;i<=m;i++)
	{
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	l=1,r=1000000000;
	while(l<=r)
	{
		int mid=(l+r)>>1; 
		//printf("l:%lld r:%lld mid:%lld\n",l,r,mid);
		if(check(mid)) r=mid-1,ans=mid;
		else l=mid+1;
	}
	if(ans==-1) cout<<"AFK";
	else printf("%lld",ans);
}
2022/7/12 07:09
加载中...