Advertisement
Guest User

Untitled

a guest
Nov 1st, 2018
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.45 KB | None | 0 0
  1. #pragma GCC optimize("Ofast")
  2. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  3. #include <bits/stdc++.h>
  4. #define f first
  5. #define s second
  6. #define mp make_pair
  7.  
  8. using namespace std;
  9.  
  10. typedef long long ll;
  11.  
  12. vector < vector <int> > g;
  13. vector < vector <int> > tree;
  14. vector <bool> used;
  15. map < pair <int, int> , int> edges;
  16. vector <ll> h;
  17. vector <int> tin, tout;
  18. vector < vector <int> > par;
  19. unordered_map <int, vector <ll> > D;
  20.  
  21. int timer = 0;
  22.  
  23. void bfs(int v){
  24.     queue <int> q;
  25.     q.push(v);
  26.     used[v] = 1;
  27.     while(!q.empty()){
  28.         v = q.front();
  29.         q.pop();
  30.         for(int i = 0; i < g[v].size(); i++){
  31.             int to = g[v][i];
  32.             if(!used[to]){
  33.                 used[to] = 1;
  34.                 tree[v].push_back(to);
  35.                 tree[to].push_back(v);
  36.                 edges[{v, to}] *= -1;
  37.                 edges[{v, to}] *= -1;
  38.                 q.push(to);
  39.             }
  40.         }
  41.     }
  42.  
  43. }
  44.  
  45. void init(int n){
  46.     int log_ = 0;
  47.     while((1 << log_) < n)log_++;
  48.     for(int i = 0; i < n; i++)par[i].resize(log_ + 1);
  49. }
  50.  
  51. void dfs(int v, int p){
  52.     tin[v] = timer++;
  53.     par[v][0] = p;
  54.     for(int i = 1; i < par[v].size(); i++)
  55.         par[v][i] = par[par[v][i - 1]][i - 1];
  56.     for(int i = 0; i < tree[v].size(); i++){
  57.         int to = tree[v][i];
  58.         if(to == p)continue;
  59.         h[to] = h[v] + edges[{v, to}];
  60.         dfs(to, v);
  61.     }
  62.     tout[v] = timer++;
  63. }
  64.  
  65. bool upper(int u, int v){
  66.     return (tin[u] <= tin[v] && tout[u] >= tout[v]);
  67. }
  68. int lca(int u, int v){
  69.     if(upper(u, v))return u;
  70.     if(upper(v, u))return v;
  71.     for(int i = par[v].size() - 1; i >= 0; i--)
  72.         if(!upper(par[v][i], u))v = par[v][i];
  73.     return par[v][0];
  74. }
  75.  
  76. void D_init(int n){
  77.     for(auto it = edges.begin(); it != edges.end(); it++){
  78.         if(it->s < 0)it->s *= -1;
  79.         else D[it->f.f].resize(n, LLONG_MAX), edges[{it->f.s, it->f.f}] *= -1;
  80.     }
  81.     for(auto it = D.begin(); it != D.end(); it++){
  82.             int i = it->f;
  83.             set < pair <ll, int> > q;
  84.             D[i][i] = 0;
  85.             q.insert({0, i});
  86.             while(!q.empty()){
  87.                 int v = q.begin()->s;
  88.                 q.erase(q.begin());
  89.                 for(int j = 0; j < g[v].size(); j++){
  90.                     int to = g[v][j];
  91.                     if(D[i][to] > D[i][v] + edges[{v, to}]){
  92.                         q.erase({D[i][to], to});
  93.                         D[i][to] = D[i][v] + edges[{v, to}];
  94.                         q.insert({D[i][to], to});
  95.                     }
  96.                 }
  97.             }
  98.     }
  99.  
  100. }
  101.  
  102. ll ans(int u, int v){
  103.     ll mn = LLONG_MAX;
  104.     for(auto it = D.begin(); it != D.end(); it++)
  105.         mn = min(mn, (it->s)[u] + (it->s)[v]);
  106.     return (min(h[u] + h[v] - 2 * h[lca(u, v)], mn));
  107. }
  108.  
  109.  
  110.  
  111. int main()
  112. {
  113.     ios_base::sync_with_stdio(0);
  114.     cin.tie(0);
  115.     int n, m;
  116.     cin >> n >> m;
  117.     g.resize(n), used.resize(n), tree.resize(n), h.resize(n), par.resize(n),
  118.     tin.resize(n), tout.resize(n);
  119.     for(int i = 0; i < m; i++){
  120.         int u, v, d;
  121.         cin >> u >> v >> d;
  122.         u--, v--;
  123.         g[u].push_back(v);
  124.         g[v].push_back(u);
  125.         edges[{u, v}] = d;
  126.         edges[{v, u}] = d;
  127.     }
  128.     bfs(0);
  129.     D_init(n);
  130.     init(n);
  131.     dfs(0, 0);
  132.     int q;
  133.     cin >> q;
  134.     while(q--){
  135.         int u, v;
  136.         cin >> u >> v;
  137.         u--, v--;
  138.         cout << ans(u, v) << '\n';
  139.     }
  140.  
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement