ChoDog

Баобаб

Nov 24th, 2019
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int n;
  8. vector<int> color(n + 1, 0);
  9. vector<int> h(n + 1, 0);
  10. vector<int> deep(n + 1, 0);
  11. vector<vector<pair<int, int>>> vec(n + 1);
  12.  
  13. void dfs(int colour, int u, int v, int weight) {
  14.     if (u == n) return;
  15.  
  16.     color[u] = colour;
  17.     deep[u] = deep[v] + weight;
  18.  
  19.     if (color[vec[u][0].first] == 0) {
  20.         dfs(colour, vec[u][0].first, u, vec[u][0].second);
  21.         h[v] = h[vec[u][0].first] + vec[u][0].second;
  22.     }
  23.     if (color[vec[u][1].first] == 0) {
  24.         dfs(colour, vec[u][1].first, u, vec[u][1].second);
  25.         h[u] = h[vec[u][1].first] + vec[u][1].second;
  26.     }
  27.  
  28. }
  29.  
  30.  
  31.  
  32. int main() {
  33.     int m, q;
  34.     int x, y;
  35.     int u, v, c;
  36.     cin >> n >> m >> q;
  37.  
  38.     vector<int> maxx(q, 1000000);
  39.  
  40.     vec.resize(n + 1);
  41.     color.resize(n + 1, 0);
  42.     h.resize(n + 1, 0);
  43.     deep.resize(n + 1, 0);
  44.     color[1] = 10000000;
  45.  
  46.     h[1] = 10000000;
  47.  
  48.  
  49.     for (int i = 0; i < m; i++) {
  50.         cin >> u >> v >> c;
  51.         vec[u].push_back(make_pair(v, c));
  52.         vec[v].push_back(make_pair(u, c));
  53.     }
  54.  
  55.     for (int i = 0; i < vec[1].size(); i++) {
  56.         dfs(i + 1, vec[1][i].first, 1, vec[1][i].second);
  57.         h[1] = min(h[1], h[vec[1][i].first] + vec[1][i].second);
  58.     }
  59.     deep[n] = h[1];
  60.     color[n] = 10000000;
  61.  
  62.     int minxy;
  63.  
  64.     for (int i = 0; i < q; i++) {
  65.         cin >> x >> y;
  66.  
  67.         if (color[x] == color[y]) {
  68.             minxy = abs(deep[x] - deep[y]);
  69.             maxx[i] = min(maxx[i], minxy);
  70.         }
  71.         else {
  72.             minxy = h[y] + h[x];
  73.             maxx[i] = min(maxx[i], minxy);
  74.  
  75.             minxy = deep[y] + deep[x];
  76.             maxx[i] = min(maxx[i], minxy);          
  77.         }
  78.  
  79.         minxy = h[1] + h[x] + deep[y];
  80.         maxx[i] = min(maxx[i], minxy);
  81.  
  82.         minxy = h[1] + h[y] + deep[x];
  83.         maxx[i] = min(maxx[i], minxy);
  84.  
  85.         minxy = h[1] + deep[x] + h[y];
  86.         maxx[i] = min(maxx[i], minxy);
  87.  
  88.         minxy = h[1] + deep[y] + h[x];
  89.         maxx[i] = min(maxx[i], minxy);
  90.          
  91.     }
  92.  
  93.     for (int i : maxx) {
  94.         cout << i << ' ';
  95.     }
  96.     return 0;
  97. }
Add Comment
Please, Sign In to add comment