Sunday, November 17, 2019

[Codeforces] F. Cheap Robot

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : F. Cheap Robot
Source            : Codeforces
Category          : Meet In The Middle
Algorithm         : Bi-Directional Search
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 2e5 + 5;  
  6. static const int logn = 19;  
  7. static const long long inf = 1e18;  
  8.   
  9. struct Node  
  10. {  
  11.       int v;  
  12.       long long w;  
  13.       Node(int v, long long w) : v(v), w(w) {}  
  14.       bool operator < (const Node &other) const  
  15.       {  
  16.             return w > other.w;  
  17.       }  
  18. };  
  19.   
  20. struct Edge  
  21. {  
  22.       int u, v;  
  23.       long long w;  
  24.       Edge(int u, int v, long long w) : u(u), v(v), w(w) {}  
  25.       bool operator < (const Edge &other) const  
  26.       {  
  27.             return w < other.w;  
  28.       }  
  29. };  
  30.   
  31. int tnode;  
  32. int tedge;  
  33. int tcenter;  
  34. int tquery;  
  35.   
  36. vector < vector <Node> > graph;  
  37. vector <Edge> Edges;  
  38. int mostparent[maxn];  
  39. long long dist[maxn];  
  40.   
  41. void dijkstra()  
  42. {  
  43.       for (int i = 1; i < maxn; i++) dist[i] = inf;  
  44.       priority_queue <Node> pq;  
  45.       for (int i = 1; i <= tcenter; i++)  
  46.       {  
  47.             pq.emplace(i, 0LL);  
  48.             mostparent[i] = i;  
  49.             dist[i] = 0LL;  
  50.       }  
  51.       while (pq.empty() == false)  
  52.       {  
  53.             int u = pq.top().v; pq.pop();  
  54.             for (Node g : graph[u])  
  55.             {  
  56.                   int v = g.v;  
  57.                   long long w = g.w;  
  58.                   long long cost = dist[u] + w;  
  59.                   if (dist[v] > cost)  
  60.                   {  
  61.                         dist[v] = cost;  
  62.                         mostparent[v] = mostparent[u];  
  63.                         pq.emplace(v, cost);  
  64.                   }  
  65.             }  
  66.       }  
  67. }  
  68.   
  69. vector <Node> Tree[maxn];  
  70. int par[maxn];  
  71.   
  72. void makeSet()  
  73. {  
  74.       for (int i = 1; i < maxn; i++) par[i] = i;  
  75. }  
  76.   
  77. int findRep(int r)  
  78. {  
  79.       if (r == par[r]) return r;  
  80.       return par[r] = findRep(par[r]);  
  81. }  
  82.   
  83. int depth[maxn];  
  84. int father[maxn][logn];  
  85. long long cost[maxn][logn];  
  86.   
  87. void dfs(int u, int p = -1)  
  88. {  
  89.       for (int i = 1; i < logn; i++)  
  90.       {  
  91.             father[u][i] = father[ father[u][i - 1] ][i - 1];  
  92.             cost[u][i] = max(cost[ father[u][i - 1] ][i - 1], cost[u][i - 1]);  
  93.       }  
  94.       for (Node g : Tree[u])  
  95.       {  
  96.             int v = g.v;  
  97.             long long w = g.w;  
  98.             if (v == p) continue;  
  99.             depth[v] = depth[u] + 1;  
  100.             father[v][0] = u;  
  101.             cost[v][0] = w;  
  102.             dfs(v, u);  
  103.       }  
  104. }  
  105.   
  106. int findlca(int u, int v, long long &maxi)  
  107. {  
  108.       if (depth[u] < depth[v]) swap(u, v);  
  109.       maxi = 0;  
  110.       for (int i = logn - 1; i >= 0; i--)  
  111.       {  
  112.             if (depth[ father[u][i] ] >= depth[v])  
  113.             {  
  114.                   maxi = max(maxi, cost[u][i]);  
  115.                   u = father[u][i];  
  116.             }  
  117.       }  
  118.       if (u == v) return u;  
  119.       for (int i = logn - 1; i >= 0; i--)  
  120.       {  
  121.             if (father[u][i] != father[v][i])  
  122.             {  
  123.                   maxi = max(maxi, cost[u][i]);  
  124.                   maxi = max(maxi, cost[v][i]);  
  125.                   u = father[u][i];  
  126.                   v = father[v][i];  
  127.             }  
  128.       }  
  129.       maxi = max(maxi, cost[u][0]);  
  130.       maxi = max(maxi, cost[v][0]);  
  131.       return father[u][0];  
  132. }  
  133.   
  134. long long get(int u, int v)  
  135. {  
  136.       long long maxi;  
  137.       int lca = findlca(u, v, maxi);  
  138.       return maxi;  
  139. }  
  140.   
  141. signed main()  
  142. {  
  143.       ios_base::sync_with_stdio(false);  
  144.       cin.tie(nullptr);  
  145.       cout.tie(nullptr);  
  146.   
  147.       #ifndef ONLINE_JUDGE  
  148.             freopen("in.txt""r", stdin);  
  149.       #endif // ONLINE_JUDGE  
  150.   
  151.       cin >> tnode >> tedge >> tcenter >> tquery;  
  152.       graph.resize(tnode + 1);  
  153.       vector <Edge> allEdges;  
  154.       for (int e = 1; e <= tedge; e++)  
  155.       {  
  156.             int u, v;  
  157.             long long w;  
  158.             cin >> u >> v >> w;  
  159.             graph[u].emplace_back(v, w);  
  160.             graph[v].emplace_back(u, w);  
  161.             allEdges.push_back({u, v, w});  
  162.       }  
  163.       dijkstra();  
  164.       for (Edge E : allEdges)  
  165.       {  
  166.             int u = E.u;  
  167.             int v = E.v;  
  168.             long long w = E.w;  
  169.             if (mostparent[u] == mostparent[v]) continue;  
  170.             long long cost = dist[u] + dist[v] + w;  
  171.             Edges.push_back({mostparent[u], mostparent[v], cost});  
  172.       }  
  173.       makeSet();  
  174.       sort(Edges.begin(), Edges.end());  
  175.       int root;  
  176.       for (Edge E : Edges)  
  177.       {  
  178.             int u = E.u;  
  179.             int v = E.v;  
  180.             long long w = E.w;  
  181.             int p = findRep(u);  
  182.             int q = findRep(v);  
  183.             if (p == q) continue;  
  184.             root = u;  
  185.             Tree[u].emplace_back(v, w);  
  186.             Tree[v].emplace_back(u, w);  
  187.             par[q] = p;  
  188.       }  
  189.       depth[root] = 1;  
  190.       dfs(root);  
  191.       while (tquery--)  
  192.       {  
  193.             int u, v;  
  194.             cin >> u >> v;  
  195.             long long ans = get(u, v);  
  196.             cout << ans << '\n';  
  197.       }  
  198. }  


No comments:

Post a Comment

Note: Only a member of this blog may post a comment.