Advertisement
Ksenia_C

Untitled

Mar 18th, 2021
650
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <iomanip>
  5. #include <iostream>
  6. #include <map>
  7. #include <string>
  8. #include <queue>
  9. #include <vector>
  10. #include <set>
  11. #include <time.h>
  12. using namespace std;
  13.  
  14.  
  15. vector<vector<pair<int, double>>>ad, und;
  16. vector<int>used;
  17. vector<vector<pair<int, double>>> par;
  18.  
  19. vector<int>dist;
  20. vector<int>level;
  21. vector<vector<int>>dp;
  22. int n, logn;
  23.  
  24. int lca(int a, int b) {
  25.     if (level[a] > level[b])swap(a, b);
  26.     for (int i = logn - 1; i >= 0; --i) {
  27.         if (level[dp[b][i]] >= level[a]) {
  28.             b = dp[b][i];
  29.         }
  30.     }
  31.     if (a == b)return a;
  32.     int ans = 0;
  33.     for (int i = logn - 1; i >= 0; --i) {
  34.         if (dp[b][i] == dp[a][i]) {
  35.             ans = dp[b][i];
  36.         } else {
  37.             b = dp[b][i];
  38.             a = dp[a][i];
  39.         }
  40.     }
  41.     return ans;
  42. }
  43.  
  44. void dfs(int u, int p) {
  45.     for (auto v : par[u]) {
  46.         if (v.first == p)continue;
  47.         dfs(v.first, u);
  48.         level[v.first] = level[u] + 1;
  49.         dp[v.first][0] = u;
  50.     }
  51. }
  52.  
  53. void solve() {
  54.     srand(time(NULL));
  55.     int m;
  56.     cin >> n >> m;
  57.     int n1 = n;
  58.     logn = 1;
  59.     while (n1 != 1) {
  60.         logn++;
  61.         n1 /= 2;
  62.     }
  63.  
  64.     ad.resize(n);
  65.     und.resize(n);
  66.     used.resize(n);
  67.     level.resize(n);
  68.     map<int, int>weights;
  69.     for (int i = 0; i < m; ++i) {
  70.         int u, v; double l; cin >> u >> v >> l;
  71.         ad[u].push_back({ v, l });
  72.         und[u].push_back({ v, l });
  73.         und[v].push_back({ u, l });
  74.     }
  75.     for (int i = 0; i < n; ++i) {
  76.         sort(und[i].begin(), und[i].end());
  77.         for (int j = 1; j < und[i].size(); ++j) {
  78.             if (und[i][j].first == und[i][j - 1].first) {
  79.                 und[i][j].second = min(und[i][j].second, und[i][j - 1].second);
  80.                 und[i][j - 1] = { n, 0 };
  81.             }
  82.         }
  83.         sort(und[i].begin(), und[i].end());
  84.         while (und[i].back().first == n)und[i].pop_back();
  85.     }
  86.    
  87.     int st = rand() % n;
  88.     set<pair<double, int>>mins;
  89.     vector<int>dist(n, 1e9);
  90.     dist[st] = 0;
  91.     mins.insert({ 0, st });
  92.     par.resize(n);;
  93.     while (!mins.empty()) {
  94.         auto rel = *mins.begin();
  95.         mins.erase(mins.begin());
  96.         for (auto v : und[rel.second]) {
  97.             if (dist[v.first] > dist[rel.second] + v.second) {
  98.                 dist[v.first] = dist[rel.second] + v.second;
  99.                 mins.insert({ dist[v.first], v.first });
  100.                 par[rel.second].push_back({ v.first, v.second });
  101.             }
  102.         }
  103.     }
  104.     dp.resize(n, vector<int>(logn));
  105.     dfs(st, st);
  106.     dp[st][0] = st;
  107.     for (int k = 1; k < logn; ++k) {
  108.         for (int i = 0; i < n; ++i) {
  109.             dp[i][k] = dp[dp[i][k - 1]][k - 1];
  110.         }
  111.     }
  112.  
  113.     int q; cin >> q;
  114.     for (int t = 0; t < q; ++t) {
  115.         int a, b; cin >> a >> b;
  116.         vector<int>dis(n, 1e9);
  117.         dis[a] = 0;
  118.         mins.insert({ 0, a });
  119.         vector<int>prev(n);
  120.         prev[a] = -1;
  121.         while (!mins.empty()) {
  122.             auto rel = *mins.begin();
  123.             mins.erase(mins.begin());
  124.             for (auto v : ad[rel.second]) {
  125.                 if (dis[v.first] > dis[rel.second] + v.second) {
  126.                     dis[v.first] = dis[rel.second] + v.second;
  127.  
  128.                     int lca1 = lca(v.first, b);
  129.                     int lower = dist[v.first] + dist[b] - 2 * dist[lca1];
  130.  
  131.                     mins.insert({ dis[v.first] + lower, v.first });
  132.                     prev[v.first] = rel.second;
  133.                 }
  134.             }
  135.         }
  136.         if (dis[b] == 1e9) {
  137.             cout << -1 << '\n';
  138.             continue;
  139.         }
  140.         vector<int>ans;
  141.         while (b != -1) {
  142.             ans.push_back(b);
  143.             b = prev[b];
  144.         }
  145.         cout << ans.size() << '\n';
  146.         reverse(ans.begin(), ans.end());
  147.         for (auto tr : ans) {
  148.             cout << tr << ' ';
  149.         }
  150.         cout << '\n';
  151.     }
  152.    
  153. }
  154.  
  155.  
  156. int main()
  157. {
  158.     cin.tie(NULL);
  159.     cout.tie(NULL);
  160.     ios_base::sync_with_stdio(false);
  161.     freopen("input.txt", "r", stdin);
  162.     freopen("output.txt", "w", stdout);
  163.     solve();
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement