求助!#2,#9 TLE
查看原帖
求助!#2,#9 TLE
467683
return_CE楼主2022/10/4 18:14
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,cnt;
int f[10010],ans,h[10010];
ll b;
bool v[10010];
struct point 
{
	int nex,to;
	ll pre;
}edg[100020];

priority_queue <pair <ll,int> > q;
int dis[10010];

bool check(int p)
{
	if(p<f[1])return 0;
	while(!q.empty())q.pop();
	memset(dis,0x7f7f7f,sizeof(dis));
	memset(v,0,sizeof(v));
	
	dis[1]=0;v[1]=1;
	q.push(make_pair(-dis[1],1));
	int root=1;
	for(int i=1;i<n;i++)
	{
		if(v[n])break;
		for(int j=h[root];j;j=edg[j].nex )
		{
			int x=edg[j].to;
			if(f[x]>p||v[x])continue;
			if(dis[root]+edg[j].pre<dis[x])
			{
				
				dis[x]=dis[root]+edg[j].pre;
				q.push(make_pair(-dis[x],x));
			}
		}
		if(!q.empty())
		{
			while(v[root])
			{
				root=q.top().second;
				q.pop();
			}
			v[root]=1;
		}
	}
	if(dis[n]<=b)return 1;
	else return 0;
}

void add(int x,int y,int z)
{
	edg[++cnt].pre=z;
	edg[cnt].to=y;
	edg[cnt].nex=h[x];
	h[x]=cnt;
}
int main()
{
	cin>>n>>m>>b;
	int maxx=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&f[i]);
		maxx=max(maxx,f[i]);
	}
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);add(y,x,z);
	}
	if(!check(maxx))
	{
		cout<<"AFK";
		return 0;
	}
	int l,r;
	l=1;r=maxx;
	while(l<r)
	{
		int mid=(l+r)>>1;
		if(check(mid))
		{
		//	ans=mid;
			r=mid;
		}
		else l=mid+1;
	}
	cout<<l;
	return 0;
}


/*
4 4 8
8
5
6
10
2 1 2
2 4 1
1 3 4
3 4 3

10
*/
2022/10/4 18:14
加载中...