在 (n) 个城市开演唱会,这 (n) 个城市的人都想去听演唱会,每个城市的票价不同,于是这些人就想是否能去其他城市听演唱会更便宜(去回都要路费)
Solution
设演唱会为 (0) 号点
连边 (0 o i),对于一对可达的城市,连边 (u leftrightarrow v)
跑最短路即可
#include <bits/stdc++.h>
using namespace std;
#define reset3f(x) memset(x,0x3f,sizeof x)
#define int long long
namespace sp {
const int N=1e+6+5;
vector<pair<int,int> > g[N];
int n,v0=1,d[N];
void make(int t1,int t2,int t3) {
g[t1].push_back(make_pair(t2,t3));
}
void reset_graph() {
for(int i=0;i<=n;i++) g[i].clear();
}
void solve() {
priority_queue<pair<int,int> > qu;
reset3f(d);
d[v0]=0;
qu.push(make_pair(0,v0));
while(qu.size()) {
int p=qu.top().second,r=qu.top().first;
qu.pop();
if(r+d[p]) continue;
for(int i=0;i<g[p].size();i++) {
int q=g[p][i].first,w=g[p][i].second;
if(d[q]>d[p]+w) {
d[q]=d[p]+w;
qu.push(make_pair(-d[q],q));
}
}
}
}
}
int n,m,t1,t2,t3;
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=m;i++) {
cin>>t1>>t2>>t3;
t3*=2;
sp::make(t1,t2,t3);
sp::make(t2,t1,t3);
}
for(int i=1;i<=n;i++) {
cin>>t1;
sp::make(0,i,t1);
}
sp::v0=0;
sp::solve();
for(int i=1;i<=n;i++) cout<<sp::d[i]<<" ";
}