Iamtui1010

floyd

Nov 11th, 2021
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<fstream>
  4. #include<vector>
  5. #include<queue>
  6. #include<algorithm>
  7.  
  8. #define long long long
  9. #define nln '\n'
  10.  
  11. const long N = 110;
  12.  
  13. using namespace std;
  14.  
  15. //GLobal variables: f1, f2, n, m,, k, mat, q, a, b
  16.  
  17. fstream f1;
  18. vector<vector<pair<long, long>>> mat(N);
  19. vector<long> a, b, q;
  20. long n, m, k;
  21.  
  22. void data()
  23. {
  24.     f1.open("dijkstra.inp", ios:: in);
  25.     cin >> n >> m >> k;
  26.     for (long i = 1; i <= m; ++i)
  27.     {
  28.         long x, y, z;
  29.         cin >> x >> y >> z;
  30.         mat[x].push_back({z, y});
  31.         mat[y].push_back({z, x});
  32.     }
  33.     a.resize(k+1, 0);
  34.     b.resize(k+1, 0);
  35.     q.resize(k+1, 0);
  36.     for (long i = 1; i <= k; ++i)
  37.         cin >> q[i] >> a[i] >> b[i];
  38.     f1.close();
  39. }
  40.  
  41. void dijkstra(long sta, long fin, long que)
  42. {
  43.     vector<long> cos, tra;
  44.     cos.resize(n+1, 1e9);
  45.     cos[sta] = 0;
  46.     tra.resize(n+1, 0);
  47.     priority_queue<pair<long, long>, vector<pair<long, long>>, greater<pair<long, long>>> pqu;
  48.     pqu.push({0, sta});
  49.     vector<bool> pic(n+1, 0);
  50.  
  51.     while (!pqu.empty())
  52.     {
  53.         long des = pqu.top().second;
  54.         pqu.pop();
  55.  
  56.         if (pic[des])
  57.             continue;
  58.  
  59.         pic[des] = 1;
  60.         for (const auto &i : mat[des])
  61.             if (!pic[i.second] && cos[i.second] > cos[des] + i.first)
  62.             {
  63.                 cos[i.second] = cos[des] + i.first;
  64.                 tra[i.second] = des;
  65.                 pqu.push({cos[i.second], i.second});
  66.             }
  67.     }
  68.     if (que == 1)
  69.     {
  70.         vector<long> ans;
  71.         ans.push_back(fin);
  72.         while (fin != sta)
  73.         {
  74.             fin = tra[fin];
  75.             ans.push_back(fin);
  76.         }
  77.         cout << ans.size() << ' ';
  78.         reverse(ans.begin(), ans.end());
  79.         for (const auto &i : ans)
  80.             cout << i << ' ';
  81.         cout << nln;
  82.     }
  83.     else
  84.         cout << cos[fin] << nln;
  85. }
  86.  
  87. void process()
  88. {
  89.     for (long i = 1; i <= k; ++i)
  90.         dijkstra(a[i], b[i], q[i]);
  91. }
  92.  
  93. int main()
  94. {
  95.     data();
  96.     process();
  97.     return 0;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment