lca模板

lca倍增模板:

 1 vector<int >vc[40000+7];
 2 int deep[K],up[K][25];
 3 
 4 void dfs(int x,int f)
 5 {
 6     deep[x]=deep[f]+1,up[x][0]=f;
 7     for(int i=1;i<=20;i++)
 8         up[x][i]=up[up[x][i-1]][i-1];
 9     for(int i=0;i<vc[x].size();i++)
10     if(vc[x][i]!=f)
11         dfs(vc[x][i],x);
12 }
13 int lca(int x,int y)
14 {
15     if(deep[x]<deep[y])swap(x,y);
16     for(int i=20;i>=0;i--)
17     if(deep[up[x][i]]>=deep[y])
18         x=up[x][i];
19     if(x==y) return x;
20     for(int i=20;i>=0;i--)
21     if(up[x][i]!=up[y][i])
22         x=up[x][i],y=up[y][i];
23     return up[x][0];
24 }

 

posted @ 2017-05-15 17:22  weeping  阅读(227)  评论(0编辑  收藏  举报