#include #include #include #include using namespace std; const int INF = INT_MAX >> 1; int main(){ int n, edge_num, start; cin >> n >> edge_num >> start; vector>> adj(n); priority_queue, vector>, greater>> dp; vector used(n, false); vector dist(n, INF); for(int i = 0; i < edge_num; i++){ int a, b, w; cin >> a >> b >> w; adj[a].push_back({b, w}); adj[b].push_back({a, w}); } dp.push({0, start}); dist[start] = 0; while(!dp.empty()){ //确定选 auto[dists, v] = dp.top(); dp.pop(); if(used[v]) continue; used[v] = true; //往后标记点 for(auto [u, d] : adj[v]){ if(!used[u] && dist[v] + d < dist[u]){//最小 dist[u] = dist[v] + d; dp.push({dist[u], u}); } } } for(auto x : dist){ if(x != INF) cout << x << " "; else cout << "INF" << " "; } cout << endl; return 0; }