LCA
倍增法:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll N=1e4+10; 5 ll bit[30]; 6 ll pre[N][30]; 7 ll depth[N]; 8 vector<int>mp[N]; 9 10 void init(int n){ 11 bit[0]=1; 12 for(int i=1;i<=29;i++){ 13 bit[i]=bit[i-1]*2; 14 } 15 for(int i=0;i<=n;i++){ 16 mp[i].clear(); 17 } 18 memset(pre,0,sizeof(pre)); 19 memset(depth,0,sizeof(depth)); 20 } 21 22 void dfs(int s,int p){ 23 pre[s][0]=p; 24 depth[s]=depth[p]+1; 25 for(int i=1;i<=29;i++){ 26 pre[s][i]=pre[pre[s][i-1]][i-1]; 27 } 28 for(int i=0;i<mp[s].size();i++){ 29 if(mp[s][i]==p) continue; 30 dfs(mp[s][i],s); 31 } 32 } 33 34 int LCA(int a,int b){ 35 if(depth[a]<depth[b]){ 36 swap(a,b); 37 } 38 int dif=depth[a]-depth[b]; 39 for(int i=29;i>=0;i--){ 40 if(dif>=bit[i]){ 41 a=pre[a][i]; 42 dif-=bit[i]; 43 } 44 } 45 if(a==b)return b; 46 for(int i=29;i>=0;i--){ 47 if(depth[a]>=bit[i]&&pre[a][i]!=pre[b][i]){ 48 a=pre[a][i]; 49 b=pre[b][i]; 50 } 51 } 52 return pre[a][0]; 53 } 54 55 int main(){ 56 int t,n,a,b; 57 cin>>t; 58 while(t--){ 59 map<int,int>mp1; 60 cin>>n; 61 init(n); 62 for(int i=1;i<=n-1;i++){ 63 scanf("%d%d",&a,&b); 64 mp1[b]=1; 65 mp[a].push_back(b); 66 mp[b].push_back(a); 67 } 68 for(int i=1;i<=n;i++){ 69 if(mp1[i]==0){ 70 dfs(i,0); 71 break; 72 } 73 } 74 scanf("%d%d",&a,&b); 75 printf("%d\n",LCA(a,b)); 76 } 77 78 79 return 0; 80 }