• Source
    1. #include <bits/stdc++.h>
    2. #define V 100005
    3. #define INF 1000005
    4.  
    5. using namespace std;
    6.  
    7. typedef pair<int, int> pii;
    8. int n, m, s, q;
    9. vector<pii> g[V];
    10. vector<int> dist(V), cnt(V), p(V);
    11.  
    12. void dijkstra(int src) {
    13. dist.assign(V, INF);
    14. cnt.assign(V, 1);
    15. p.assign(V, 0);
    16. dist[src] = 0;
    17. set<pii> heap;
    18. heap.insert({dist[src], src});
    19. while (!heap.empty()) {
    20. int u = heap.begin() -> second;
    21. heap.erase(heap.begin());
    22. for (auto pp : g[u]) {
    23. int v = pp.first;
    24. int d = pp.second;
    25. if (dist[v] == dist[u] + d) cnt[v] += cnt[u];
    26. if (dist[v] > dist[u] + d) {
    27. if (dist[v] != INF) {
    28. heap.erase(heap.find({dist[v], v}));
    29. }
    30. dist[v] = dist[u] + d;
    31. cnt[v] = cnt[u];
    32. p[v] = u;
    33. heap.insert({dist[v], v});
    34. }
    35. }
    36. }
    37. }
    38.  
    39. int main(){
    40. cin >> n >> m;
    41. int x, y, z;
    42. for (int i = 1; i <= m; i++) {
    43. cin >> x >> y >> z;
    44. g[x].push_back({y,z});
    45. g[y].push_back({x,z});
    46. }
    47. cin >> s;
    48. dijkstra(s);
    49. for (int i = 1; i <= n; i++) {
    50. cout << dist[i] << " ";
    51. }
    52. return 0;
    53. }
    54.