codevs 4175 二分+spfa判断

来源:互联网 发布:游族网络最新消息 编辑:程序博客网 时间:2024/06/03 00:08
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;const int MAXN=100000+10;const int MAXM=500000+10;ll n,m,u,v,s;ll f[MAXN],vi[MAXN];ll len=0,last[MAXN];ll dis[MAXN];bool vis[MAXN]; struct edge{  ll to,val,next; }e[MAXN*2];void add(ll from,ll to,ll val){  e[++len]=(edge){to,val,last[from]};  last[from]=len;}bool check(int mid){  deque<long long>q;  memset(vis,0,sizeof(vis));  memset(dis,63,sizeof(dis));  if(vi[u]<=f[mid]) q.push_front(u);  else return 0;  vis[u]=1;dis[u]=0;  while(!q.empty()){    int cur=q.front(); q.pop_front();    vis[cur]=0;    for(ll i=last[cur];i;i=e[i].next){      int id=e[i].to;      if(vi[id]<=f[mid]){        if(dis[id]>dis[cur]+e[i].val){          dis[id]=dis[cur]+e[i].val;          if(!vis[id]){            vis[id]=1;            if(!q.empty()){            if(dis[id]>dis[q.front()]) q.push_back(id);            else q.push_front(id);           }           else q.push_front(id);          }        }      }    }  }  if(dis[v]<s) return 1;  else return 0; }int main(){  scanf("%lld%lld%lld%lld%lld",&n,&m,&u,&v,&s);  fo(i,1,n) {    scanf("%lld",&f[i]);    vi[i]=f[i];  }  sort(f+1,f+1+n);  ll x,y,z;  fo(i,1,m){    scanf("%lld%lld%lld",&x,&y,&z);    add(x,y,z); add(y,x,z);  }  ll l=1,r=n,ans=1e12;  while(l<=r){    ll mid=(l+r)/2;    if(check(mid)){      ans=min(ans,f[mid]);      r=mid-1;    }    else l=mid+1;  }  if(ans==1e12) printf("-1");  else printf("%lld",ans);  return 0;}
0 0
原创粉丝点击