LCA rmq st model

LCA:倍增

memset(p,-1,sizeof(p));

inline void dfs(int u)
{
  for (int i=head[u];i!=-1;i=e[i].next)
  {
     int v=e[i].v;
     if (deep[v]==0)
     {
       deep[v]=deep[u]+1;
       p[v][0]=u;
       dfs(v);
     }
  }
}


void init()
{
   for (int j=1;(1<<j)<=n;j++)
   for (int i=1;i<=n;i++)
   if (p[i][j-1]!=-1)
   p[i][j]=p[p[i][j-1]][j-1];
}
//deep[1]的初始为1
int lca(int a,int b)
{
   int i,j;
   if (deep[a]<deep[b]) swap(a,b);
   for (i=0;(1<<i)<=deep[a];i++);
   i--;

   for (j=i;j>=0;j--)
   if (deep[a]-(1<<j)>=deep[b])
   a=p[a][j];
   if (a==b) return a;


   for (j=i;j>=0;j--)
   {
     if (p[a][j]!=-1&&p[a][j]!=p[b][j])
     {
       a=p[a][j];
       b=p[b][j];
     }
   }
   return p[a][0];
}

 

posted on 2015-08-17 15:24  forgot93  阅读(217)  评论(0编辑  收藏  举报

导航