建立超级原点,将边权设为票价,其他普通边权*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; }