#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define fi first
#define se second
typedef long long ll;
typedef pair<ll,ll>P;
const int N = 100005;
struct node{
int to;
int c;
};
vector<node>G[N];
int d[N];
int n,m;
void Dji(int s){
priority_queue<P, vector<P>, greater<P> >q;
memset(d, 0x3f, sizeof(d));
d[s] = 0; //ini
q.push({s,0});
while(!q.empty()){
P t = q.top(); q.pop();
ll u = t.fi;
if(d[u] < t.se) continue;// if bigger than ,give up
for(int i = 0; i < G[u].size(); i++){
node e = G[u][i];
if(d[e.to] > e.c + d[u]){ // updata
d[e.to] = e.c + d[u];
q.push({e.to, d[e.to]});
}
}
}
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; i++){
int u,v,c;cin >> u >> v >> c;
G[u].push_back({v,c});
}Dji(1);
for(int i = 1; i <= n; i++){
cout << d[i] << " ";
}
return 0;
}
/*
3 4
1 2 100
2 3 100
3 1 100
2 1 1
*/
迪杰斯特拉-优先队列-堆优化-模板
最新推荐文章于 2022-12-13 18:28:35 发布