• CF938D Buy a Ticket(最短路)


    建立超级原点,将边权设为票价,其他普通边权*2

    做一遍最短路即可

    #include<bits/stdc++.h>
    #define getsz(p) (p?p->sz:0)
    using namespace std;
    typedef long long ll;
    typedef pair<ll,int> pll;
    const int mod=1e9+7;
    const int N=1e6+10;
    int h[N],ne[N],e[N];
    ll w[N],idx;
    ll dis[N];
    int st[N],n;
    void add(int a,int b,ll c){
        e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
    }
    void dij(){
        priority_queue<pll,vector<pll>,greater<pll> > q;
        for(int i=1;i<=n;i++)
            dis[i]=1e18;
        dis[0]=0;
        q.push({0,0});
        while(q.size()){
            auto t=q.top();
            q.pop();
            if(st[t.second])
                continue;
            st[t.second]=1;
            for(int i=h[t.second];i!=-1;i=ne[i]){
                int j=e[i];
                if(dis[j]>dis[t.second]+w[i]){
                    dis[j]=dis[t.second]+w[i];
                    q.push({dis[j],j});
                }
            }
    
        }
    }
    int main(){
        //ios::sync_with_stdio(false);
        int m;
        memset(h,-1,sizeof h);
        cin>>n>>m;
        int i;
        for(i=1;i<=m;i++){
            int u,v;
            ll c;
            scanf("%d%d%lld",&u,&v,&c);
            add(u,v,2*c);
            add(v,u,2*c);
        }
        for(i=1;i<=n;i++){
            ll x;
            scanf("%lld",&x);
            add(0,i,x);
        }
        dij();
        for(i=1;i<=n;i++){
            printf("%lld ",dis[i]);
        }
        cout<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    二维数组的使用及其内存结构
    一维数组的练习
    数组的默认初始化
    数组
    完数
    break与continue
    乘法表及质数的输出法
    嵌套循环的使用
    Elasticsearch索引和查询性能调优
    elasticsearch数据冷热分离、数据冷备
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13472570.html
Copyright © 2020-2023  润新知