Beingamanforever

Floyd Warshall 3, Travel by Car

Feb 8th, 2025
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. // #include <atcoder/all>
  3. using namespace std;
  4. #define int long long
  5. #define all(x) (x).begin(), (x).end()
  6. typedef vector<int> vi;
  7. typedef vector<vi> vvi;
  8. typedef vector<pair<int, int>> vpi;
  9. typedef pair<int, int> pi;
  10. #define f first
  11. #define s second
  12. #define pb push_back
  13. #define endl "\n"
  14. #define yes cout << "YES" << endl
  15. #define no cout << "NO" << endl
  16. int dx[] = {-1, 0, 1, 0};
  17. int dy[] = {0, 1, 0, -1};
  18. const int mod1 = 1e9 + 7, mod2 = 998244353, INF = 2e18, N = 2e5 + 5, L = 19;
  19. int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
  20. // -----------------------------------------------------------------------------
  21.  
  22. void solve()
  23. {
  24.     int n, m, l;
  25.     cin >> n >> m >> l;
  26.     vvi dist(n + 1, vi(n + 1, INF)), dist2(n + 1, vi(n + 1, INF));
  27.     for (int i = 1; i <= n; i++)
  28.     {
  29.         dist[i][i] = 0, dist2[i][i] = 0;
  30.     }
  31.     for (int i = 0; i < m; i++)
  32.     {
  33.         int u, v, w;
  34.         cin >> u >> v >> w;
  35.         dist[u][v] = w, dist[v][u] = w;
  36.     }
  37.     for (int k = 1; k <= n; k++)
  38.     {
  39.         for (int i = 1; i <= n; i++)
  40.         {
  41.             for (int j = 1; j <= n; j++)
  42.             {
  43.                 if (dist[i][k] < INF && dist[k][j] < INF)
  44.                 {
  45.                     dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
  46.                 }
  47.             }
  48.         }
  49.     }
  50.     // if dist[i][j] <= L, put 1 and then apply Floyd Warshall on transformed graph
  51.     for (int i = 1; i <= n; i++)
  52.     {
  53.         for (int j = 1; j <= n; j++)
  54.         {
  55.             if ((i != j) && dist[i][j] <= l)
  56.             {
  57.                 dist2[i][j] = 1;
  58.             }
  59.         }
  60.     }
  61.     for (int k = 1; k <= n; k++)
  62.     {
  63.         for (int i = 1; i <= n; i++)
  64.         {
  65.             for (int j = 1; j <= n; j++)
  66.             {
  67.                 if (dist2[i][k] < INF && dist2[k][j] < INF)
  68.                 {
  69.                     dist2[i][j] = min(dist2[i][j], dist2[i][k] + dist2[k][j]);
  70.                 }
  71.             }
  72.         }
  73.     }
  74.     int q;
  75.     cin >> q;
  76.     while (q--)
  77.     {
  78.         int u, v;
  79.         cin >> u >> v;
  80.         cout << ((dist2[u][v] == INF) ? -1 : dist2[u][v] - 1) << endl;
  81.     }
  82.     return;
  83. }
  84.  
  85. signed main()
  86. {
  87.     // __START__;
  88.     ios_base::sync_with_stdio(false);
  89.     cin.tie(NULL);
  90.     cout.tie(NULL);
  91.     int t = 1;
  92.     // cin >> t;
  93.     while (t--)
  94.     {
  95.         solve();
  96.     }
  97.     // __END__;
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment