73pts 求助

P1462 通往奥格瑞玛的道路

sipu6174 @ 2020-03-14 12:52:13

WA #1 #4 #7

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,b,maxn;
int head[N],to[N<<1],nxt[N<<1],w[N<<1],cnt=1;
int cost[N],d[N],v[N];
priority_queue<pair<int,int> >q;
void add(int u,int v,int e){
   to[cnt]=v;
   w[cnt]=e;
   nxt[cnt]=head[u];
   head[u]=cnt++;
}
void dij(){
   memset(d,0x3f,sizeof d);
   d[1]=0;
   q.push(make_pair(0,1));
   while(q.size()){
      int x=q.top().second;q.pop();
      if(v[x]) continue;
      v[x]=1;
      for(int i=head[x];i;i=nxt[i]){
         int y=to[i],z=w[i];
         if(d[y]>d[x]+z){
            d[y]=d[x]+z;
            q.push(make_pair(-d[y],y));
         }
      }
   }
}
bool check(int x){
   memset(v,0,sizeof v);
   for(int i=1;i<=n;i++)
      if(cost[i]>x) v[i]=1;
   if(v[n]) return 0;
   // for(int i=1;i<=n;i++)
   //    cout<<v[i]<<" ";
   // cout<<endl;
   dij();
   // cout<<d[n]<<endl;
   if(d[n]<b) return 1;
   return 0;
}
int main(){
   ios::sync_with_stdio(0);
   cin>>n>>m>>b;
   for(int i=1;i<=n;i++) cin>>cost[i],maxn=max(maxn,cost[i]);
   for(int i=1,u,v,w;i<=m;i++){
      cin>>u>>v>>w;
      add(u,v,w),add(v,u,w);
   }
   int l=1,r=maxn;
   while(l+1<r){
      int mid=(l+r)>>1;
      if(check(mid)) r=mid;
      else l=mid;
   }
   cout<<r;
   return 0;
}

by junyu33 @ 2020-03-14 12:58:21

没写AFK


by 懵逼小蒟蒻 @ 2020-04-05 17:30:39

AFK?


|