Advertisement
Rana_093

LCA

Oct 21st, 2018
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long int
  6. #define db(x) cout<<#x<<" -> "<<x<<endl
  7. #define mp make_pair
  8. #define maxn 50005
  9. #define xx first
  10. #define yy second
  11.  
  12. vector < pair< int , pair< int , int > > > v;
  13. int n,m;
  14. int parent[maxn];
  15. vector< pair<int, int > > g[maxn];
  16. int dis[maxn],lvl[maxn],par[maxn];
  17. bool vis[maxn];
  18. int sparse_parent[maxn][20],sparse_dist[maxn][20];
  19.  
  20. int findset(int x){
  21.     if(x!=parent[x]){
  22.         parent[x] = findset(parent[x]);
  23.     }
  24.     return parent[x];
  25. }
  26.  
  27. void kruskal(){
  28.     for(int i=0; i<=n; i++){
  29.         parent[i] = i;
  30.     }
  31.     sort(v.begin(),v.end());
  32.     for(int i=0; i<v.size(); i++){
  33.         int pu = findset(v[i].second.first);
  34.         int pv = findset(v[i].second.second);
  35.         if(pu!=pv){
  36.             g[v[i].yy.xx].push_back(mp(v[i].yy.yy,v[i].xx));
  37.             g[v[i].yy.yy].push_back(mp(v[i].yy.xx,v[i].xx));
  38.             parent[pu] = pv;
  39.         }
  40.     }
  41. }
  42.  
  43. void dfs(int src, int parent , int dep){
  44.     vis[src] = true;
  45.     par[src] = parent;
  46.     lvl[src] = dep;
  47.     for(int i=0; i<g[src].size(); i++){
  48.         int x = g[src][i].xx;
  49.         int y = g[src][i].yy;
  50.         if( vis[x] ) continue;
  51.         dis[x] = min(dis[src]+y,dis[x]);
  52.         dfs(x,src,dep+1);
  53.     }
  54. }
  55.  
  56. void lca_init(){
  57.     memset(sparse_parent,-1,sizeof(sparse_parent));
  58. //  memset(sparse_dist,0,sizeof(sparse_dist));
  59.     for(int i=0; i<n; i++ ){  ///sparse_parent[i][j] : node i er 2^j th parent; sparse_dist[i][j] : node i e 2^j th parent porjonto max weight
  60.         sparse_parent[i][0] = par[i];
  61.         if(par[i]==-1) { sparse_dist[i][0] = dis[i] ; continue; }
  62.         sparse_dist[i][0] = (dis[i] - dis[par[i]]);
  63.        // printf("sparse_dist[%d][%d]: %d\n",i,0,sparse_dist[i][0]);
  64.     }
  65.     for(int j=1; (1<<j)<n; j++){
  66.         for(int i=0; i<n; i++){
  67.             if(sparse_parent[i][j-1]==-1) continue;
  68.             sparse_parent[i][j] = sparse_parent[sparse_parent[i][j-1]][j-1] ;
  69.             sparse_dist[i][j] = max(sparse_dist[i][j-1],sparse_dist[sparse_parent[i][j-1]][j-1]);
  70.          //   printf("sparse_dist[%d][%d]: %d\n",i,j,sparse_dist[i][j]);
  71.         }
  72.     }
  73. }
  74.  
  75. int lca_query(int p, int q){
  76.     if(lvl[p]<lvl[q]) swap(p,q);
  77.     int log = 1;
  78.     while(true){
  79.         int next = log+1;
  80.         if((1<<next)>lvl[p]) break;
  81.         log++;
  82.     }
  83.     int ret = -1000000;
  84.     for(int i=log; i>=0; i--){  ///same level e niye ashtechi
  85.         if((lvl[p]-(1<<i))>=lvl[q]){
  86.             ret = max(ret,sparse_dist[p][i]);
  87.             p = sparse_parent[p][i];
  88.         }
  89.     }
  90.     if(p==q) return ret;
  91.     for(int i=log; i>=0; i--){
  92.         if(sparse_parent[p][i]!=-1 && sparse_parent[p][i]!=sparse_parent[q][i]){
  93.             ret = max(ret,max(sparse_dist[p][i],sparse_dist[q][i]));
  94.             p = sparse_parent[p][i];
  95.             q = sparse_parent[q][i];
  96.         }
  97.     }
  98.     int x ,y;
  99.     if(par[p]==-1) x = dis[p];
  100.     else x = dis[p]-dis[par[p]];
  101.     if(par[q]==-1) y = dis[q];
  102.     else y = dis[q]-dis[par[q]];
  103.     ret = max(ret,max(x,y));
  104.     return ret;
  105. }
  106.  
  107.  
  108. int main(){
  109.     ios_base::sync_with_stdio(false);
  110.     cin.tie(0);
  111.     int t;
  112. //    cout<<log2(maxn)<<endl;
  113.     cin>>t;
  114.     int tc  = 0 ;
  115.     while(t--){
  116.         cin>>n>>m;
  117.         for(int i=1; i<=m; i++){
  118.             int a,b,c;
  119.             cin>>a>>b>>c;
  120.             a--;
  121.             b--;
  122.             v.push_back(mp(c,mp(a,b)));
  123.         }
  124.         kruskal();
  125.         memset(dis,1000000,sizeof(dis));
  126.         memset(vis,false,sizeof(vis));
  127.         dis[0] = 0;
  128.         dfs(0,-1,0);
  129. //        for(int i=0; i<n; i++){
  130. //          cout<<i<<" : "<<dis[i]<<endl;
  131. //        }
  132.         lca_init();
  133.         printf("Case %d:\n",++tc);
  134.         int q;
  135.         cin>>q;
  136.         while(q--){
  137.             int a,b;
  138.             cin>>a>>b;
  139.             a--;
  140.             b--;
  141.             printf("%d\n",lca_query(a,b));
  142.         }
  143.         for(int i=0; i<=n; i++){
  144.             g[i].clear();
  145.         }
  146.         v.clear();
  147.     }
  148.     return 0;
  149. }
  150.  
  151. /**
  152. 2
  153. 4 5
  154. 1 2 10
  155. 1 3 20
  156. 1 4 100
  157. 2 4 30
  158. 3 4 10
  159. 2
  160. 1 4
  161. 4 1
  162. 2 1
  163. 1 2 100
  164. 1
  165. 1 2
  166.  
  167. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement