又写了一个板子,本来准备多种姿势求lca的,结果只调出了树上倍增求lca,时(总)运(想)不(打)济(摆)啊
明天写好了 一言不合就立flag
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define maxm 500050 6 #define maxn 500050 7 using namespace std; 8 struct node{int to,next;}e[maxm*2]; 9 int cnt,head[maxn],deep[maxn],p[maxn][20],n,m,s; 10 void add(int x,int y) 11 { 12 e[++cnt]=(node){y,head[x]};head[x]=cnt; 13 } 14 inline void dfs(int u) 15 { 16 int i; 17 for(i=head[u];i;i=e[i].next) 18 { 19 if(!deep[e[i].to]) 20 { 21 deep[e[i].to]=deep[u]+1; 22 p[e[i].to][0]=u; 23 dfs(e[i].to); 24 } 25 } 26 } 27 void pre() 28 { 29 for(int j=1;j<=19;j++) 30 for(int i=1;i<=n;i++) 31 if(p[i][j-1]) p[i][j]=p[p[i][j-1]][j-1]; 32 } 33 int lca(int a,int b) 34 { 35 int j; 36 if(deep[a]<deep[b]) swap(a,b); 37 for(j=19;j>=0;j--) 38 if(deep[p[a][j]]>=deep[b]) 39 a=p[a][j]; 40 if(a==b) return a; 41 for( j=19;j>=0;j--) 42 { 43 if(p[a][j]!=p[b][j]) 44 { 45 a=p[a][j]; 46 b=p[b][j]; 47 } 48 } 49 return p[a][0]; 50 } 51 void work() 52 { 53 int x,y; 54 while(m--) 55 { 56 scanf("%d%d",&x,&y); 57 printf("%d ",lca(x,y)); 58 } 59 } 60 int main() 61 { 62 int x,y; 63 scanf("%d%d%d",&n,&m,&s); 64 for(int i=1;i<n;i++) 65 { 66 scanf("%d%d",&x,&y); 67 add(x,y);add(y,x); 68 } 69 deep[s]=1; 70 dfs(s); 71 pre(); 72 work(); 73 return 0; 74 }
以上 By 啦啦啦萝卜