#include #include #include #include using namespace std; #define INF 10000010 vector> graph[5 * 100001]; int dis[5 * 100001]; int dij(vector> *v, int s, int *dis) { priority_queue, vector>, greater>> pq; // source distance to zero. pq.push(make_pair(0, s)); dis[s] = 0; int u; while (!pq.empty()) { u = (pq.top()).second; pq.pop(); for (vector>::iterator it = v[u].begin(); it != v[u].end(); it++) { if (dis[u] + it->first < dis[it->second]) { dis[it->second] = dis[u] + it->first; pq.push(make_pair(dis[it->second], it->second)); } } } } int main() { int m, n, l, x, y, s; // n--> number of nodes , m --> number of edges cin >> n >> m; for (int i = 0; i < m; i++) { // input edges. scanf("%d%d%d", &x, &y, &l); graph[x].push_back(make_pair(l, y)); graph[y].push_back( make_pair(l, x)); // comment this line for directed graph } // start node. scanf("%d", &s); // intialise all distances to infinity. for (int i = 1; i <= n; i++) dis[i] = INF; dij(graph, s, dis); for (int i = 1; i <= n; i++) if (dis[i] == INF) cout << "-1 "; else cout << dis[i] << " "; return 0; }