程设练习
马蜂很丑,想法是用优先队列广搜.....
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int N = 2e5 + 5;
priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>> q;
long long dp[N];
vector<pair<int,long long>>v[N];
int n,m;
int main(){
cin >> n >> m;
for(int i = 1; i <= m; i++){
long long a,b,c;
cin >> a >> b >> c;
v[a].push_back({b,c});
v[b].push_back({a,c});
}
for(int i = 1; i <= n; i++){
cin >> dp[i];
q.push({dp[i],i});
}
while(!q.empty()){
auto cur = q.top();
q.pop();
int index = cur.second;
long long cost = cur.first;
for(auto e:v[index]){
if(dp[e.first] >= cost + 2 * e.second){
dp[e.first] = cost + 2 * e.second;
q.push({dp[e.first],e.first});
}
}
}
for(int i = 1; i <= n; i++){
cout << dp[i] << " ";
}
}