This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, int> pli;
const int MX=100010, inf=2e9;
const ll linf=2e17;
int n, m, h0, H[MX];
vector<pii> G[MX];
ll S[MX];
ll ans=linf;
void gozero(){
ll D[MX];
priority_queue<pli, vector<pli>, greater<pli>> Q;
for(int i=1; i<=n; i++) D[i]=linf;
D[1]=0; Q.push({0,1});
while(!Q.empty()){
int v=Q.top().second; ll d=Q.top().first; Q.pop();
if(D[v]!=d) continue;
for(pii &p:G[v]){
int x,c; tie(x,c)=p;
ll now=d+c;
if(h0-now<0) continue;
if(h0-now>H[x]) now=h0-H[x];
if(now>=D[x]) continue;
D[x]=now; Q.push({now,x});
}
}
if(D[n]<=h0) ans=D[n]+H[n]-(h0-D[n]);
for(int i=1; i<=n; i++) S[i]=linf;
for(int i=1; i<=n; i++){
if(h0<D[i]) continue;
S[i]=min(S[i], D[i] + (h0-D[i]));
for(pii &e:G[i]){
int x,c; tie(x,c)=e;
S[x]=min(S[x], D[i] + abs(h0-D[i]-c) + c);
}
}
if(S[n]<linf) ans=min(ans, S[n]+H[n]);
// for(int i=1; i<=n; i++) cout<<S[i]<<' ';
// cout<<'\n';
}
ll solve(){
ll D[MX];
priority_queue<pli, vector<pli>, greater<pli>> Q;
for(int i=1; i<=n; i++) D[i]=linf;
for(int i=1; i<=n; i++)
if(S[i]<linf) D[i]=S[i], Q.push({D[i], i});
while(!Q.empty()){
int v=Q.top().second; ll d=Q.top().first; Q.pop();
if(D[v]!=d) continue;
for(pii &e:G[v]){
int x,c; tie(x,c)=e; c*=2;
if(D[v]+c>=D[x]) continue;
D[x]=D[v]+c; Q.push({D[x], x});
}
}
// for(int i=1; i<=n; i++) cout<<D[i]<<' ';
// cout<<'\n';
return D[n]+H[n];
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
cin>>n>>m>>h0;
for(int i=1; i<=n; i++) cin>>H[i];
for(int i=1; i<=m; i++){
int u, v, c; cin>>u>>v>>c;
if(H[u]-c>=0) G[u].push_back({v,c});
if(H[v]-c>=0) G[v].push_back({u,c});
}
gozero();
ans=min(ans, solve());
cout<<(ans>=linf ? -1 : ans);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |