求助水题
查看原帖
求助水题
716099
lovely_hyzhuo楼主2023/10/16 21:53
#include<bits/stdc++.h>
#define int long long
using namespace std;
const long long INF=(1ll<<31)-1;
struct node
{
    int to,dis,next;
}edge[10000010];
int n,m,b;
long long d[1000010];
bool vis[1000010];
int f[1000010];
int head[1000010],tot;
void add(int from,int to,int dis)
{
    edge[++tot].to=to;
	edge[tot].dis=dis;
    edge[tot].next=head[from];
    head[from]=tot;
}
bool dijstra(int mid)
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)
    	d[i]=INF;
    d[1]=0;
    priority_queue<pair<long long ,int> >q;
    if(f[1]>mid)
    	return false;
    q.push(make_pair(0,1));
    while(q.size())
    {
        int x=q.top().second;
		q.pop();
        if(vis[x])
			continue;
        vis[x]=1;
        for(int i=head[x];i;i=edge[i].next)
        {
            int y=edge[i].to,dis=edge[i].dis;
            if(d[y]>=d[x]+dis&&f[y]<=mid)
            {
                d[y]=d[x]+dis;
                q.push(make_pair(-d[y],y));
            }           
        }
    } 
	if(d[n]<=b)
		return true;
	return false; 
}
signed main()
{
	cin>>n>>m>>b;
	for(int i=1;i<=n;i++)
		cin>>f[i];
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
	}
	int l=0,r=100000010;
	if(!dijstra(r))
	{
		cout<<"AFK";
		return 0;
	}
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(dijstra(mid))
			r=mid;
		else
			l=mid+1;
	}
	cout<<l<<endl;
	return 0;
}

本地TLE

2023/10/16 21:53
加载中...