最近公共祖先LCA 模板
阿新 • • 發佈:2018-12-18
程式碼如下:
#include<cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #define ll long long #define N 500005 using namespace std; struct node { int next; int to; }edg[N<<1]; int hea[N],cnt=1; void init() { memset(hea,-1,sizeof(hea)); cnt=1; } void add(int u,int v) { edg[cnt].next=hea[u]; edg[cnt].to=v; hea[u]=cnt++; } int dep[N]; int f[N][30]; void dfs(int rx,int fx,int de) { dep[rx]=de; f[rx][0]=fx; for(int i = hea[rx];i != -1;i=edg[i].next) { int to=edg[i].to; if(to==fx) continue; dfs(to,rx,de+1); } } int LCA(int x,int y) { if(dep[x]>dep[y]) { swap(x,y); } for(int i = 25;i >= 0;i--) { if(dep[f[y][i]]>=dep[x]) { y=f[y][i]; } } if(x==y) return x; for(int i = 25;i >= 0;i--) { if(f[y][i]!=f[x][i]) { x=f[x][i]; y=f[y][i]; } } return f[x][0]; } int main() { int n,m,s; init(); scanf("%d%d%d",&n,&m,&s); for(int i = 1;i < n;i++) { int a,b; scanf("%d%d",&a,&b); add(a,b),add(b,a); } dfs(s,s,1); for(int i = 1;i <= 25;i++) { for(int j = 1;j <= n;j++) { f[j][i]=f[f[j][i-1]][i-1]; } } for(int i = 1;i <= m;i++) { int a,b; scanf("%d%d",&a,&b); printf("%d\n",LCA(a,b)); } return 0 ; }