P1462 通往奥格瑞玛的道路

P1462 通往奥格瑞玛的道路

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
	int v,b,m;
	
};
bool operator < (node x,node y)
{
	return x.b > y.b;
}
int n,m,b;
int coss[100001],point[100001],nxt[1000001],blo[1000001],des[1000001],maxcos;
int cnt;
int sumo,subl;
int dis[100001],mawid[100001],vis[100001];
priority_queue <node > q;
int INF;
int ans = 1e9;
bool flag = false;


void add(int x,int y,int z)
{
	cnt++;
	des[cnt] = y;
	nxt[cnt] = point[x];
	point[x] = cnt;
	blo[cnt] = z;
}

void dij(int maxx)
{
	memset(vis,0,sizeof(vis));
	memset(dis,0x3f,sizeof(dis));
	if(maxx < coss[1] || maxx < coss[n])return ;
	INF = dis[0];
	dis[1] = 0;
	vis[1] = true;
	while(!q.empty())q.pop();
	q.push((node){1,0,coss[1]});
	while(!q.empty())
	{
		node v = q.top();
		if(v.v == n)
		{
			ans = min(ans,v.m);
			flag = true;
		}
		q.pop();
		for(int i = point[v.v]; i; i = nxt[i])
		{
			int u = des[i];
			if(u == v.v)continue;//自环 
			if(!vis[u])
			{
				if( coss[u] <= maxx && v.b + blo[i] < b && v.b + blo[i] < dis[u])
				{
					dis[u] = v.b + blo[i];
					if(vis[u] == false)q.push((node){u,dis[u],max(v.m,coss[u])}),vis[u] = true;
				}
			}
		}
	}
}

signed main()
{
	cin >> n >> m >> b;
	int z,x,y;
	for (int i = 1; i <= n; i++)
	{
		cin >> x;
		coss[i] = x;
		maxcos = max(maxcos,x);
	}
	for (int i = 1; i <= m; i++)
	{
		cin >> x >> y >> z;
		add(x,y,z),add(y,x,z);
	}
	int l = 0,r = maxcos;
	while(l < r)//二分最大收费 
	{
		int mid = ( (r + l) >> 1 );
		dij(mid);
		if(dis[n] > b)//达不到 
		{
			l = mid + 1;
		}
		else
		{
			r = mid;
		}
	}
	dij(l);
	if(flag == false)
	{
		cout << "AFK";
	}
	else
	{
		cout << ans;
	}
	return 0;
}

二分最大收费即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值