wa#5#8,Dijkstra+优先队列的
查看原帖
wa#5#8,Dijkstra+优先队列的
1117206
SpringQinHao楼主2024/6/23 19:06
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
const int N=2e5;
typedef long long ll;
using namespace std;
struct edge{
	ll u,to;
	ll w;
	edge(ll a,ll b,ll c)
	{
		u=a,to=b,w=c;
	}
};
vector <edge> e[N];
struct node
{
	ll id,dis;
	node(ll a,ll b){
		id=a;dis=b;
	}
};
struct cmp
{	
	bool operator()(node a,node b)
	{
		return a.dis>b.dis;
	}
};
ll m,n,b,pre[N],dis[N],f[N];
bool done[N];
ll maxx=-1,ans=-1,l,r;
bool check(ll x)
{
	if(f[1]>x) return 0;
	memset(dis,0x7f,sizeof(dis));
	memset(done,0,sizeof(done));
	dis[1]=0;
	priority_queue<node,vector<node>,cmp> q;
	q.push(node(1,dis[1]));
	while(!q.empty())
	{
		//printf("!!!\n");
		node u=q.top();
		q.pop();
		if(done[u.id])continue;
		done[u.id]=true;
		for(ll i=0;i<e[u.id].size();i++)
		{
			edge y=e[u.id][i];
			//if(done[y.to]) continue;
			if(f[y.to]>x) continue;
			if(dis[y.to]>y.w+u.dis)
			{
				dis[y.to]=y.w+u.dis;
				q.push(node(y.to,dis[y.to]));
				if(y.to==n)
				{
					if(dis[n]>=b) return 0;
					else return 1;
				}
			}
			
		}
	}
	return 0;
}
int main()
{
	scanf("%lld%lld%lld",&n,&m,&b);
	for(ll i=1;i<=n;i++) scanf("%lld",&f[i]),maxx=max(maxx,f[i]);
	
	while(m--)
	{
		ll u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		e[u].push_back(edge(u,v,w));
		e[u].push_back(edge(v,u,w));
	} 
	l=1,r=maxx;
	while(l<=r)
	{
		ll mid=(l+r)>>1;
		if(check(mid)) ans=mid,r=mid-1;
		else l=mid+1;
	}
	if(ans==-1) printf("AFK");
	else printf("%lld",ans);
	return 0;
}
2024/6/23 19:06
加载中...