CCPC-Wannafly Winter Camp Day1 F 爬爬爬山(最短路+思维)

题目描述

爬山是wlswlswls最喜欢的活动之一。

在一个神奇的世界里,一共有nnn座山,mmm条路。

wlswlswls初始有kkk点体力,在爬山的过程中,他所处的海拔每上升1m1m1m,体力会减111点,海拔每下降1m1m1m,体力会加一点。

现在wlswlswls想从111号山走到nnn号山,在这个过程中,他的体力不能低于000,所以他可以事先花费一些费用请dlsdlsdls把某些山降低,将一座山降低lll米需要花费l∗ll*lll的代价,且每座山的高度只能降低一次。因为wlswlswls现在就在111号山上,所以这座山的高度不可降低。

wlswlswls从111号山到nnn号山的总代价为降低山的高度的总代价加上他走过的路的总长度。

wlswlswls想知道最小的代价是多少。

输入描述

第一行三个整数nnn,mmm,kkk。

接下来一行nnn个整数,第iii个整数hih_ihi表示第iii座山的高度。

接下来mmm行,每行三个整数xxx,yyy,zzz表示xyxyxy之间有一条长度为zzz的双向道路。

扫描二维码关注公众号,回复: 6102101 查看本文章

经过每条路时海拔是一个逐步上升或下降的过程。

数据保证111号山和nnn号山联通。

1≤n,k,hi,z≤1000001 \leq n, k, h_i, z \leq 1000001n,k,hi,z100000

1≤m≤2000001 \leq m \leq 2000001m200000

1≤x,y≤n1 \leq x, y \leq n1x,yn

x≠yx \neq 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 }





猜你喜欢

转载自www.cnblogs.com/zhangbuang/p/10804398.html