倍增lca模板

来源:互联网 发布:传奇人物数据保存失败 编辑:程序博客网 时间:2024/06/06 02:10

看cf代码,看到别人写得那么简洁,学习了。

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int maxn=200020;int head[maxn],tol,deg[maxn],fa[maxn][23];struct node {      int next,to;}edge[20*maxn];void add(int u,int v){      edge[tol].to=v;      edge[tol].next=head[u];      head[u]=tol++;}void dfs(int u,int pre){      deg[u]=deg[pre]+1;      fa[u][0]=pre;      for(int i=1;i<23;i++)fa[u][i]=fa[fa[u][i-1]][i-1];      for(int i=head[u];i!=-1;i=edge[i].next)      {     int v=edge[i].to;     if(v==pre)continue;     dfs(v,u);      }}int lca(int x,int y){      if(deg[x]<deg[y])swap(x,y);      for(int i=0;i<22;i++)if((deg[x]-deg[y])&(1<<i))x=fa[x][i];      if(x==y)return x;      for(int i=22;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];      return fa[x][0];}int main(){      int i,j,k,m,n;     // freopen("data.in","r",stdin);    //  freopen("data.out","w",stdout);      while(cin>>n>>m)      {     memset(head,-1,sizeof(head));tol=0;     for(i=1;i<n;i++)     {    cin>>j>>k;    add(j,k);    add(k,j);     }     dfs(1,1);    // for(i=1;i<=n;i++)cout<<deg[i]<<" ";cout<<endl;           while(m--)    {   cin>>i>>j;   cout<<lca(i,j)<<endl;    }      }      return 0;}


0 0
原创粉丝点击