Advertisement
Guest User

1271 Timus

a guest
Jan 20th, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. /*
  2.     Author: ChimitovZ
  3. */
  4. #include <bits/stdc++.h>
  5.  
  6. #pragma comment(linker, "/STACK:16777216")
  7.  
  8. using namespace std;
  9.  
  10. int N;
  11. vector<int> Costs, Tour;
  12. vector< vector<int> > G;
  13. vector< vector<short> > W;
  14. vector<char> used;
  15.  
  16. inline void calcDepthsAndCosts();
  17. inline void calcTour(int v);
  18. inline void printAns(int a, int b);
  19.  
  20. int main()
  21. {
  22.     cin >> N;
  23.     Costs.resize(N);
  24.     used.resize(N, 'f');
  25.     G.resize(N);
  26.     W.resize(N, vector<short>(N));
  27.     for(int i = 1, u, v, w; i < N; ++i){
  28.         cin >> u >> v >> w;
  29.         G[u].push_back(v);
  30.         G[v].push_back(u);
  31.         W[u][v] = w;
  32.         W[v][u] = w;
  33.     }
  34.     calcDepthsAndCosts();
  35.     /* -=Вывод всех глубин и стоимостей=-
  36.     for(int i = 0; i < N; ++i){
  37.         cout << "Вершина №" << i << ", Глубина = " << Depths[i] << ", Стоимость пути = " << Costs[i] << endl;
  38.     }
  39.     */
  40.     calcTour(0);
  41.     for(int i = 0; i < N; ++i){
  42.         G[i].clear();
  43.     }
  44.     /* -=Вывод пути Эйлера=-
  45.     cout << "Tour:\n";
  46.     for(int i = 0; i < Tour.size(); ++i){
  47.         cout << Tour[i] << " ";
  48.     }
  49.     cout << "\n";
  50.     //*/
  51.     int M;
  52.     cin >> M;
  53.     for(int i = 0, a, b; i < M; ++i){
  54.         cin >> a >> b;
  55.         printAns(a, b);
  56.         cout << "\n";
  57.     }
  58.     return 0;
  59. }
  60.  
  61. inline void calcDepthsAndCosts()
  62. {
  63.     queue<int> Q;
  64.     vector<char> usedTwo;
  65.     usedTwo.resize(N, 'f');
  66.     Q.push(0);
  67.     Costs[0] = 0;
  68.     while(!Q.empty()){
  69.         int cur = Q.front();
  70.         usedTwo[cur] = 't';
  71.         Q.pop();
  72.         for(int i = 0; i < G[cur].size(); ++i){
  73.             int to = G[cur][i];
  74.             if(usedTwo[to] == 'f'){
  75.                 Q.push(to);
  76.                 Costs[to] = Costs[cur] + W[cur][to];
  77.             }
  78.         }
  79.     }
  80. }
  81.  
  82. inline void calcTour(int v)
  83. {
  84.     used[v] = 't';
  85.     Tour.push_back(v);
  86.     for(int i = 0; i < G[v].size(); ++i){
  87.         int to = G[v][i];
  88.         if(used[to] == 'f'){
  89.             calcTour(to);
  90.         }
  91.         if(G[v].size() > 1){
  92.             Tour.push_back(v);
  93.         }
  94.     }
  95. }
  96.  
  97. inline void printAns(int a, int b)
  98. {
  99.     if(a == b){
  100.         cout << 0;
  101.         return;
  102.     }
  103.     int l, r;
  104.     bool flagA = 0, flagB = 0;
  105.     for(int i = 0; i < Tour.size(); ++i){
  106.         if(flagA == 0 && Tour[i] == a){
  107.             l = i;
  108.             flagA = 1;
  109.         }
  110.         if(flagB == 0 && Tour[i] == b){
  111.             r = i;
  112.             flagB = 1;
  113.         }
  114.         if(flagA && flagB){
  115.             break;
  116.         }
  117.     }
  118.     if(l > r){
  119.         swap(l, r);
  120.     }
  121.     int mnNumber = Tour[l];
  122.     for(int i = l; i <= r; ++i){
  123.         if(Costs[Tour[i]] < Costs[mnNumber]){
  124.             mnNumber = Tour[i];
  125.         }
  126.     }
  127.     cout << Costs[a] + Costs[b] - 2 * Costs[mnNumber];
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement