30pts,玄2关求条
查看原帖
30pts,玄2关求条
1250354
CP_2309楼主2024/7/22 08:37
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
struct node
{
	int to,nex,w;
}e[N*4];
int head[N*4],cnt,dis[N];
int f[N],n,m,b;
bool vis[N];
void add(int x,int y,int z)
{
	cnt++;
	e[cnt].to=y;
	e[cnt].w=z;
	e[cnt].nex=head[x];
	head[x]=cnt;
}
priority_queue<pair<int,int> >q; 
int dij(int k)
{
	while (q.size()) q.pop();
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof vis);
	q.push(make_pair(0,1));
	dis[1]=0;
	while(!q.empty())
	{
	 	int x=q.top().second;
	 	q.pop();
	 	if(vis[x]) continue;
	 	vis[x]=1;
	 	for(int i=head[x];i;i=e[i].nex)
	 	{
	 		int y=e[i].to;
	 		if (f[y]>k) continue;
	 		if(dis[x]+e[i].w<dis[y])
	 		{
	 			dis[y]=dis[x]+e[i].w;
	 			q.push(make_pair(-dis[y],y));
			}
		}
	}
	return (dis[n]>b);
}
signed main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	cin >> n >> m >> b;
	int l=1e9,r=-1;
	for (int i=1;i<=n;++i)
	{
		cin >> f[i];
		l=min(l,f[i]);
		r=max(r,f[i]); 
	}
	for (int i=1;i<=m;++i)
	{
		int x,y,z;
		cin >> x >> y >> z;
		add(x,y,z);
		add(y,x,z);
	}
//	cout << l << ' ' << r << endl;
	while (l<r)
	{
		int mid=l+(r-l)/2;
//		cout << mid << endl;
		if (dij(mid)) 
		{	
			l=mid+1;
		} 
		else 
		{
			r=mid;
		}
	}
	if (dij(l))
	{
		puts("AFK");
	}
	else cout << l;
	return 0;
}
2024/7/22 08:37
加载中...