题目描述
爬山是wlswlswls最喜欢的活动之一。
在一个神奇的世界里,一共有nnn座山,mmm条路。
wlswlswls初始有kkk点体力,在爬山的过程中,他所处的海拔每上升1m1m1m,体力会减111点,海拔每下降1m1m1m,体力会加一点。
现在wlswlswls想从111号山走到nnn号山,在这个过程中,他的体力不能低于000,所以他可以事先花费一些费用请dlsdlsdls把某些山降低,将一座山降低lll米需要花费l∗ll*ll∗l的代价,且每座山的高度只能降低一次。因为wlswlswls现在就在111号山上,所以这座山的高度不可降低。
wlswlswls从111号山到nnn号山的总代价为降低山的高度的总代价加上他走过的路的总长度。
wlswlswls想知道最小的代价是多少。
输入描述
第一行三个整数nnn,mmm,kkk。
接下来一行nnn个整数,第iii个整数hih_ihi表示第iii座山的高度。
接下来mmm行,每行三个整数xxx,yyy,zzz表示xyxyxy之间有一条长度为zzz的双向道路。
经过每条路时海拔是一个逐步上升或下降的过程。
数据保证111号山和nnn号山联通。
1≤n,k,hi,z≤1000001 leq n, k, h_i, z leq 1000001≤n,k,hi,z≤100000
1≤m≤2000001 leq m leq 2000001≤m≤200000
1≤x,y≤n1 leq x, y leq n1≤x,y≤n
x≠yx eq yx�=y
输出描述
一行一个整数表示答案。
样例输入 1
4 5 1 1 2 3 4 1 2 1 1 3 1 1 4 100 2 4 1 3 4 1
样例输出 1
6
这题一开始看错了。题目的意思是 降低一座山的高度,而我一开始以为是爬上这座山,(完全不一样的概念。。。。。)
既然这是降低一座山的高度,那爬不上去的山就永远爬不上去,所以建立边的时候把奖山高的话费也算进去就行了,
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 200000+5; 5 #define int ll 6 int n,m; 7 ll k; 8 9 typedef pair<ll,int> P; 10 vector<P> G[maxn]; 11 priority_queue<P,vector<P>,greater<P> > que; 12 13 ll dis[maxn]; 14 ll h[maxn]; 15 16 void dj() { 17 memset(dis,0x3f,(n+3)*sizeof(ll)); 18 dis[1]=0; 19 que.push(P(0,1)); 20 while(!que.empty()) { 21 P tp=que.top(); 22 que.pop(); 23 int u=tp.second,v; 24 if(dis[u]<tp.first) continue; 25 for(int i=0; i<G[u].size(); i++) { 26 P tmp=G[u][i]; 27 v=G[u][i].second; 28 if(dis[v]>dis[u]+tmp.first) { 29 dis[v]=dis[u]+tmp.first; 30 que.push(P(dis[v],v)); 31 } 32 } 33 } 34 cout<<dis[n]<<endl; 35 } 36 37 signed main() { 38 scanf("%d %d %lld",&n,&m,&k); 39 for(int i=0; i<n; i++) scanf("%lld",&h[i+1]); 40 k+=h[1]; 41 int st,ed; 42 ll co; 43 for(int i=0; i<m; i++) { 44 //cout<<"NOW: "<<i<<endl; 45 46 scanf("%lld %lld %lld",&st,&ed,&co); 47 48 49 50 51 if(h[ed]>k) G[st].push_back(P(co+(h[ed]-k)*(h[ed]-k),ed)); 52 53 else G[st].push_back(P(co,ed)); 54 55 if(h[st]>k) G[ed].push_back(P(co+(h[st]-k)*(h[st]-k),st)); 56 else G[ed].push_back(P(co,st)); 57 58 59 } 60 //puts("###"); 61 dj(); 62 return 0; 63 }