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
原文地址:https://www.cnblogs.com/ctyakwf/p/13472570.html