Advertisement
tuki2501

floyd.cpp

Nov 16th, 2021
569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 105;
  5.  
  6. int n, m, q;
  7. int dist[N][N], trace[N][N];
  8.  
  9. bool chmin(int &a, int b) {
  10.   if (a > b) { a = b; return true; }
  11.   return false;
  12. }
  13.  
  14. int main() {
  15.   cin.tie(0)->sync_with_stdio(0);
  16.   cin >> n >> m >> q;
  17.   memset(dist, 0x3f, sizeof(dist));
  18.   for (int i = 1; i <= n; i++) {
  19.     dist[i][i] = 0;
  20.     trace[i][i] = i;
  21.   }
  22.   for (int i = 1; i <= m; i++) {
  23.     int u, v, c;
  24.     cin >> u >> v >> c;
  25.     if (chmin(dist[u][v], c)) {
  26.       trace[u][v] = v;
  27.     }
  28.     if (chmin(dist[v][u], c)) {
  29.       trace[v][u] = u;
  30.     }
  31.   }
  32.   for (int k = 1; k <= n; k++)
  33.   for (int i = 1; i <= n; i++)
  34.   for (int j = 1; j <= n; j++) {
  35.     if (chmin(dist[i][j], dist[i][k] + dist[k][j])) {
  36.       trace[i][j] = trace[i][k];
  37.     }
  38.   }
  39.   auto printTrace = [](int u, int v)->void {
  40.     vector<int> vec;
  41.     while (true) {
  42.       vec.push_back(u);
  43.       if (u == v) break;
  44.       u = trace[u][v];
  45.     }
  46.     cout << vec.size() << ' ';
  47.     for (int i = 0; i < (int) vec.size(); i++) {
  48.       cout << vec[i] << " \n"[i + 1 == vec.size()];
  49.     }
  50.   };
  51.   while (q--) {
  52.     int t, u, v;
  53.     cin >> t >> u >> v;
  54.     if (t == 0) {
  55.       cout << dist[u][v] << '\n';
  56.     }
  57.     else {
  58.       printTrace(u, v);
  59.     }
  60.   }
  61. }
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement