zoukankan      html  css  js  c++  java
  • 爬爬爬山

    传送门:

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define re register
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    const int N=1e6;
    const int P=1e9+7;
    void read(int &a)
    {
        a=0;
        int d=1;
        char ch;
        while(ch=getchar(),ch>'9'||ch<'0')
            if(ch=='-')
                d=-1;
        a=ch-'0';
        while(ch=getchar(),ch>='0'&&ch<='9')
            a=a*10+ch-'0';
        a*=d;
    }
    void write(int x)
    {
        if(x<0)
            putchar(45),x=-x;
        if(x>9)
            write(x/10);
        putchar(x%10+'0');
    }
    int head[N];
    struct note
    {
        int v,dis,next;
    }edge[N];
    int num;
    void add(int u,int v,int dis)
    {
        edge[++num].next=head[u];
        edge[num].v=v;
        edge[num].dis=dis;
        head[u]=num;
    }
    struct node
    {
        ll cost,now,nowh,pos;
        bool operator < (const node & x) const {return x.cost<cost;}
    };
    priority_queue <node> q;
    ll dis[N];
    int h[N];
    inline void dijstra()
    {
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        while(!q.empty())
        {
            node p=q.top();
            q.pop();
            int u=p.pos;
            if(dis[u]<p.cost)
                continue;
            for(re int i=head[u];i;i=edge[i].next)
            {
                int v=edge[i].v;
                int w=edge[i].dis;
                ll co=min(0ll,p.now-(h[v]-p.nowh));
                if(dis[v]>dis[u]+w+co*co)
                {
                    dis[v]=dis[u]+w+co*co;
                    q.push({dis[v],max(0ll,p.now-(h[v]-p.nowh)),h[v]+co,v});
                }
            }
        }
    }
    int main()
    {
        int n,m,k;
        read(n);
        read(m);
        read(k);
        for(re int i=1;i<=n;i++)
            read(h[i]);
        for(re int i=1;i<=m;i++)
        {
            int u,v,w;
            read(u);
            read(v);
            read(w);
            add(u,v,w);
            add(v,u,w);
        }
        q.push({0,k,h[1],1});
        dijstra();
        cout<<dis[n]<<endl;
        return 0;
    }
  • 相关阅读:
    单列模式
    经济数据价格走势图(包括纸黄金),可以查看历史
    UVA10010的类似BFS做法
    转:数据结构专项之Hash函数
    ZOJ1709 DFS和BFS两种搜索方法
    HDU1969(二分搜索)
    HDU1045 回溯
    HDU2899(三分搜索)
    安神口中的水题
    HDU2199(二分搜索无限逼近)
  • 原文地址:https://www.cnblogs.com/acm1ruoji/p/10753466.html
Copyright © 2011-2022 走看看