Advertisement
Guest User

Imperial Roads

a guest
Feb 21st, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define topper top //XDDDDDDD
  6.  
  7. #define mp make_pair
  8. #define pb push_back
  9. #define db(x) cerr << #x << " == " <<  x << endl;
  10. #define _ << " " <<
  11.  
  12. typedef long long ll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15.  
  16. const long double EPS = 1e-9;
  17. const int N=1e5+5;
  18. const int MOD=1e9+7;
  19. const int INF=0x3f3f3f3f;
  20.  
  21. int n, r, ans;
  22. ll cost;
  23. int par[N], sz[N], sp[30][N], m[30][N], h[N];
  24. vector<int> adj[N];
  25. vector<pair<int, pair<int, int>>> ed;
  26. map<ii, int> wt;
  27.  
  28. int find(int i) { return i == par[i] ? i : par[i] = find(par[i]); }
  29.  
  30. void unite(int a, int b) {
  31.   if((a = find(a)) == (b = find(b))) return;
  32.  
  33.   if(sz[a] > sz[b]) swap(a, b);
  34.   par[a] = b; sz[b] += sz[a];
  35. }
  36.  
  37. ll mst() {
  38.   for(int i=1; i<=n; i++) adj[i].clear();
  39.  
  40.   sort(ed.begin(), ed.end());
  41.  
  42.   ll res = 0;
  43.   for(auto i : ed) {
  44.     int u = i.second.first, v = i.second.second;
  45.     if(find(u) != find(v)) {
  46.       unite(u, v);
  47.       res += i.first;
  48.       adj[u].pb(v), adj[v].pb(u);
  49.     }
  50.   }
  51.   return res;
  52. }
  53.  
  54. void dfs(int u) {
  55.   for(int v : adj[u]) {
  56.     if(!h[v]) {
  57.       h[v] = h[u] + 1;
  58.       sp[0][v] = u;
  59.       m[0][v] = wt[mp(u,v)];
  60.       //db(v _ u _ h[v] _ adj[u].size());
  61.       dfs(v);
  62.     }
  63.   }
  64. }
  65.  
  66. int go(int j, int d) {
  67.   for(int i=19; i>=0; i--) if((1<<i) & d) {
  68.     ans = max(ans, m[i][j]);
  69.     j = sp[i][j];
  70.   }
  71.   return j;
  72. }
  73.  
  74. int lca(int a, int b) {
  75.   if(h[a] > h[b]) swap(a, b);
  76.  
  77.   //printf("lca of %d %d: ", a, b);
  78.  
  79.   ans = 0;
  80.  
  81.   b = go(b, h[b] - h[a]);
  82.  
  83.   if(b == a) return ans;
  84.  
  85.   for(int i=19; i>0; i--) if(sp[i][a] != sp[i][b]) {
  86.    ans = max(ans, m[i][a]); ans = max(ans, m[i][b]);
  87.     a = sp[i][a]; b = sp[i][b];
  88.   }
  89.  
  90.   ans = max(ans, m[0][a]); ans = max(ans, m[0][b]);
  91.   a = sp[0][a], b = sp[0][b];
  92.  
  93.   //printf("%d\n", ans);
  94.   return ans;
  95. }
  96.  
  97. int main(){
  98.   srand(time(0));
  99.  
  100.   while(scanf("%d %d", &n, &r) != EOF) {
  101.     memset(m, 0, sizeof m);
  102.     memset(par, 0, sizeof par);
  103.     memset(h, 0, sizeof h);
  104.     memset(sz, 0, sizeof sz);
  105.     memset(sp, 0, sizeof sp);
  106.  
  107.     wt.clear(); ed.clear();
  108.  
  109.     for(int i=0; i<r; i++) {
  110.       int u, v, c;
  111.       scanf("%d %d %d", &u, &v, &c);
  112.  
  113.       ed.pb(mp(c, mp(u,v))), ed.pb(mp(c, mp(v,u)));
  114.       wt[mp(u,v)] = wt[mp(v,u)] = c;
  115.     }
  116.  
  117.     for(int i=1; i<=n; i++) par[i] = i, sz[i] = 1;
  118.  
  119.     //printf("mst...\n");
  120.     cost = mst();
  121.  
  122.     int root = 1 + rand() % n;
  123.     h[root] = 1;
  124.     //printf("cost: %lld\n", cost);
  125.     //printf("dfs...\n");
  126.     dfs(root);
  127.  
  128.     //printf("first step of sparse table...\n");
  129.     for(int i=0; i<20; i++) sp[i][0] = 0;
  130.     sp[0][1] = 0;
  131.  
  132.     //printf("second step of sparse table...\n");
  133.     for(int i=1; i<20; i++) {
  134.       for(int j=1; j<=n; j++) {
  135.         sp[i][j] = sp[i-1][sp[i-1][j]];
  136.         m[i][j] = max(m[i-1][sp[i-1][j]], m[i-1][j]);
  137.       }
  138.     }
  139.  
  140.     int q;
  141.     scanf("%d", &q);
  142.     for(int i=0; i<q; i++) {
  143.       int u, v;
  144.       scanf("%d %d", &u, &v);
  145.       printf("%lld\n", cost + wt[mp(u,v)] - lca(u,v));
  146.     }
  147.   }
  148.  
  149.   return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement