Guest User

Lca Java

a guest
May 27th, 2012
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.01 KB | None | 0 0
  1.   ArrayList<Integer>[] g;
  2.   int n, l;
  3.   int tin[], tout[];
  4.   int timer;
  5.   int up[][];
  6.    
  7.   void dfs (int v, int p) {
  8.     tin[v] = ++timer;
  9.     up[v][0] = p;
  10.     for (int i=1; i&lt;=l; ++i)
  11.       up[v][i] = up[up[v][i-1]][i-1];
  12.     for (int i = 0; i &lt; g[v].size(); i++) {
  13.       int to = g[v].get(i);
  14.       if (to != p)
  15.         dfs(to, v);
  16.     }
  17.     tout[v] = ++timer;
  18.   }
  19.    
  20.   boolean upper (int a, int b) {
  21.     return tin[a] <= tin[b] && tout[a] >= tout[b];
  22.   }
  23.    
  24.   int lca (int a, int b) {
  25.     if (upper (a, b))  return a;
  26.     if (upper (b, a))  return b;
  27.     for (int i=l; i&gt;=0; --i)
  28.       if (! upper (up[a][i], b))
  29.     a = up[a][i];
  30.     return up[a][0];
  31.   }
  32.  
  33.   void solve() {
  34.     g = new ArrayList[n];
  35.     for (int i = 0; i &lt; n; i++)
  36.       g[i] = new ArrayList <Integer>();
  37.     tin = new int[n];
  38.     tout = new int[n];
  39.     up = new int[n][];
  40.     l = 1;
  41.     while ((1 << l) <= n) ++l;
  42.     for (int i = 0; i < n; i++)
  43.       up[i] = new int[l + 1];
  44.     dfs(0, 0);
  45.     // code here:
  46.  
  47.   }
Advertisement
Add Comment
Please, Sign In to add comment