[jzyzoj2021]lca模板题
查找最近公共祖先...我也不知道这东西有什么用,在线写法,非常之慢....
存代码
View Code
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int n,m; struct nod{ int y; int next; }e[200020]; int head[100010]={}; int dep[100010]={}; int size[100010]={}; int son[100010]={}; int top[100010]={}; int f[100010]={}; int tot=0; void init(int x,int y){ e[++tot].next=head[x]; head[x]=tot; e[tot].y=y; } void dfs1(int x){ dep[x]=dep[f[x]]+1; size[x]=1; for(int i=head[x];i;i=e[i].next){ if(e[i].y!=f[x]&&!f[e[i].y]){ f[e[i].y]=x; dfs1(e[i].y); size[x]+=size[e[i].y]; if(size[son[x]]<size[e[i].y]) son[x]=e[i].y; } } } void dfs2(int x){ if(x==son[f[x]])top[x]=top[f[x]]; else top[x]=x; for(int i=head[x];i;i=e[i].next){ if(f[e[i].y]==x) dfs2(e[i].y); } } int ask(int x,int y){ while(top[x]!=top[y]){ if(dep[top[x]]>dep[top[y]]) x=f[top[x]]; else y=f[top[y]]; } if(dep[x]<dep[y]) return x; else return y; } int main(){ scanf("%d%d",&n,&m); int x,y; for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); init(x,y); init(y,x); } dfs1(1); dfs2(1); for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); printf("%d\n",ask(x,y)); } return 0; }