zoukankan      html  css  js  c++  java
  • 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的双向道路。

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

    数据保证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 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 }





  • 相关阅读:
    133-使用django实现评论数统计功能
    132-django中的css美化(基本美化)
    java字符串处理常用方法
    SQL练习
    IntelliJ IDEA 2019.3 最新破解方法
    最详细的http协议、tcp/ip协议(转)
    B-tree和B+tree
    红黑树详解
    由一个算法题引发的哈夫曼树讲解
    sourcetree,创建工作流报错:Fatal: Not a gitflow-enabled repo yet. Please run 'git flow init' first.-》解决办法
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/10804398.html
Copyright © 2011-2022 走看看