码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】树链剖分求LCA

时间:2017-11-06 21:28:16      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:size   dfs   line   lap   hid   logs   closed   last   ast   

洛谷3379

技术分享
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=500010,inf=1e9;
 5 int n,m,x,y,root,tot,dep[maxn],son[maxn],size[maxn],fa[maxn],top[maxn],last[maxn];
 6 struct edge{int to,pre;}e[maxn<<1];
 7 inline void read(int &k){
 8     k=0; int f=1; char c=getchar();
 9     while(c<0||c>9)c==-&&(f=-1),c=getchar();
10     while(0<=c&&c<=9)k=k*10+c-0,c=getchar();
11     k*=f;
12 }
13 void add(int x,int y){e[++tot].to=y; e[tot].pre=last[x]; last[x]=tot;}
14 void dfs1(int x){
15     size[x]=1; dep[x]=dep[fa[x]]+1;
16     for (int i=last[x],to;i;i=e[i].pre)
17     if ((to=e[i].to)!=fa[x]){
18         fa[to]=x; dfs1(to);
19         size[x]+=size[to];
20         if (size[to]>size[son[x]]) son[x]=to;
21     }
22 }
23 void dfs2(int x,int tp){
24     top[x]=tp;
25     if (son[x]) dfs2(son[x],tp);
26     for (int i=last[x],to;i;i=e[i].pre)
27     if ((to=e[i].to)!=fa[x]&&to!=son[x]) dfs2(to,to);
28 }
29 int lca(int x,int y){
30     int f1=top[x],f2=top[y];
31     while(f1!=f2){
32         if (dep[f1]<dep[f2]) swap(x,y),swap(f1,f2);
33         x=fa[f1]; f1=top[x];
34     }
35     return dep[x]<dep[y]?x:y;
36 }
37 int main(){
38     read(n); read(m); read(root);
39     for (int i=1;i<n;i++) read(x),read(y),add(x,y),add(y,x);
40     dfs1(root); dfs2(root,root);
41     for (int i=1;i<=m;i++) read(x),read(y),printf("%d\n",lca(x,y));
42     return 0;
43 }
View Code

【模板】树链剖分求LCA

标签:size   dfs   line   lap   hid   logs   closed   last   ast   

原文地址:http://www.cnblogs.com/DriverLao/p/7794810.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!