#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e5 + 10;
const ll inf = (ll)1e16;
int n, m;
bool vis[N];
ll dis[N];
vector <pii> g[N];
struct Node{
int id; ll d;
Node() {}
Node(int id, ll d):id(id),d(d){}
bool operator < (const Node &A) const {
return d > A.d;
}
};
void dijkstra(int st){
for(int i=1; i<=n; i++){
vis[i] = 0;
dis[i] = inf;
}
dis[st] = 0;
priority_queue <Node> Q;
Q.push(Node(st, 0));
Node nd;
while(!Q.empty()){
nd = Q.top(); Q.pop();
if(vis[nd.id]) continue;
vis[nd.id] = true;
for(int i=0; i<g[nd.id].size(); i++){
int j = g[nd.id][i].first;
int k = g[nd.id][i].second;
if(nd.d + k < dis[j] && !vis[j]){
dis[j] = nd.d + k;
Q.push(Node(j, dis[j]));
}
}
}
}
int main(){
int x, y, z, st, ed, cas = 0;
scanf("%d", &cas);
while(cas--){
scanf("%d%d%d", &n, &m, &st);
for(int i=1; i<=n; i++) g[i].clear();
while(m--){
scanf("%d%d%d", &x, &y, &z);
g[x].push_back(make_pair(y, z));
//g[y].push_back(make_pair(x, z));
}
dijkstra(st);
for(int i=1; i<=n; i++)
printf("%d%s", dis[i], " \n"[i==n]);
}
}
引自:https://blog.csdn.net/scar_halo/article/details/82825418