AquaBlitz11

Hyperloop

Mar 18th, 2019
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int G[1010][1010];
  5. int dist[1010], par[1010];
  6. bool visited[1010];
  7.  
  8. int main()
  9. {
  10.     int n, m, z;
  11.     scanf("%d%d%d", &n, &m, &z);
  12.     int s, t;
  13.     scanf("%d%d", &s, &t);
  14.     while (m--) {
  15.         int u, v, w;
  16.         scanf("%d%d%d", &u, &v, &w);
  17.         if (z < w)
  18.             G[u][v] = G[v][u] = w;
  19.     }
  20.     int q;
  21.     scanf("%d", &q);
  22.  
  23.     for (int i = 0; i < n; ++i)
  24.         dist[i] = 1e9;
  25.     dist[s] = 0;
  26.     while (true) {
  27.         // find min node
  28.         int mindist = 1e9, u = -1;
  29.         for (int i = 0; i < n; ++i) {
  30.             if (!visited[i] && dist[i] < mindist) {
  31.                 mindist = dist[i];
  32.                 u = i;
  33.             }
  34.         }
  35.         if (u == -1) break;
  36.         // set visit
  37.         visited[u] = true;
  38.         // update neighbors of u
  39.         for (int v = 0; v < n; ++v) {
  40.             if (G[u][v] && !visited[v] && dist[u]+G[u][v] < dist[v]) {
  41.                 dist[v] = dist[u]+G[u][v];
  42.                 par[v] = u;
  43.             }
  44.         }
  45.     }
  46.     if (!visited[t]) {
  47.         printf("-1\n");
  48.         return 0;
  49.     }
  50.     printf("%d\n", dist[t]);
  51.     if (q == 1) return 0;
  52.  
  53.     int u = t;
  54.     vector<int> ans;
  55.     while (u != s) {
  56.         ans.push_back(u);
  57.         u = par[u];
  58.     }
  59.     ans.push_back(s);
  60.  
  61.     printf("%d\n", ans.size());
  62.     for (int i = ans.size()-1; i >= 0; --i)
  63.         printf("%d ", ans[i]);
  64.  
  65.     return 0;
  66. }
Add Comment
Please, Sign In to add comment