欢迎光临散文网 会员登陆 & 注册

P1462 通往奥格瑞玛的道路

2023-03-07 19:23 作者:仓鼠翞  | 我要投稿

//https://www.luogu.com.cn/problem/P1462?contestId=96625
#include<bits/stdc++.h>
using namespace std;

struct Node
{
   long long v;//临接点
   long long w;//边权
   friend bool operator < (const Node &n1 , const Node &n2)
   {
       return n1.w > n2.w;
   }
};
//bool operator < (Node lhs , Node rhs)
//{
//    return lhs.w > rhs.w;
//}

#define maxn 10010

long long n,m;
long long b;
long long f[maxn];//点权值
vector<Node> G[maxn];

long long dist[maxn];
bool visited[maxn];
priority_queue <Node> h;
bool dijsktra(long long x)//此时的限制点权为x
{
   if(f[1]>x||f[n]>x) return false;//起点终点超过最大点权
   fill(dist,dist+maxn,LONG_LONG_MAX);
   fill(visited,visited+maxn,false);
   //核心:如果此时的点权超过最大值则完全设置为访问
   for(int i=1;i<=n;i++)
   {
       if(f[i]>x)
           visited[i] = true;
   }
   dist[1]=0;
   h.push(Node{1,0});
   while(h.empty()==false)
   {
       long long midnode = h.top().v;
       h.pop();
       if(visited[midnode]==true)
           continue;
       visited[midnode]=true;
       for(int j=0;j<G[midnode].size();j++)
       {
           long long v=G[midnode][j].v;
           long long weight=G[midnode][j].w;
               if (dist[v] > dist[midnode] + weight)
               {
                   dist[v] = dist[midnode] + weight;
                   h.push(Node{v, dist[v]});
               }
       }
   }
   if(dist[n]<b)
       return true;
   else
       return false;
}

int main()
{
   long long maxx = -1 ;//maxx记录的是最大费用
   scanf("%lld%lld%lld",&n,&m,&b);
   for(int i=1;i<=n;i++)
   {
       scanf("%lld",&f[i]);
       if(f[i]>maxx)
           maxx = f[i];
   }

   //存储图
   long long t1,t2,tc;
   for(int i=1;i<=m;i++)
   {
       scanf("%lld%lld%lld",&t1,&t2,&tc);
       if(t1 == t2) continue;//题中说明:可能有两条边连接着相同的城市。
       G[t1].push_back(Node{t2,tc});
       G[t2].push_back(Node{t1,tc});
   }

   //二分点权
   long long l = 1;//最小点权
   long long r =maxx;//最大点权
   long long mid;
   long long ans = -1;
   while(l<=r)
   {
       mid = (l+r)/2;//限制最大点权
       if(dijsktra(mid))
       {
           //如果此次限制可以走通继续二分
           ans = mid ;
           r   = mid -1;
       }
       else
       {
           l = mid + 1;
       }
   }

   if(ans == -1)
   {
       //走不通
       printf("AFK");
   }
   else
   {
       printf("%lld",l);
   }
   return 0;
}

P1462 通往奥格瑞玛的道路的评论 (共 条)

分享到微博请遵守国家法律