查找最近公共祖先...我也不知道这东西有什么用,在线写法,非常之慢....
存代码
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 int n,m; 8 struct nod{ 9 int y; 10 int next; 11 }e[200020]; 12 int head[100010]={}; 13 int dep[100010]={}; 14 int size[100010]={}; 15 int son[100010]={}; 16 int top[100010]={}; 17 int f[100010]={}; 18 int tot=0; 19 void init(int x,int y){ 20 e[++tot].next=head[x]; 21 head[x]=tot; 22 e[tot].y=y; 23 } 24 void dfs1(int x){ 25 dep[x]=dep[f[x]]+1; 26 size[x]=1; 27 for(int i=head[x];i;i=e[i].next){ 28 if(e[i].y!=f[x]&&!f[e[i].y]){ 29 f[e[i].y]=x; 30 dfs1(e[i].y); 31 size[x]+=size[e[i].y]; 32 if(size[son[x]]<size[e[i].y]) son[x]=e[i].y; 33 } 34 } 35 } 36 void dfs2(int x){ 37 if(x==son[f[x]])top[x]=top[f[x]]; 38 else top[x]=x; 39 for(int i=head[x];i;i=e[i].next){ 40 if(f[e[i].y]==x) dfs2(e[i].y); 41 } 42 } 43 int ask(int x,int y){ 44 while(top[x]!=top[y]){ 45 if(dep[top[x]]>dep[top[y]]) x=f[top[x]]; 46 else y=f[top[y]]; 47 } 48 if(dep[x]<dep[y]) return x; 49 else return y; 50 } 51 int main(){ 52 scanf("%d%d",&n,&m); 53 int x,y; 54 for(int i=1;i<n;i++){ 55 scanf("%d%d",&x,&y); 56 init(x,y); 57 init(y,x); 58 } 59 dfs1(1); 60 dfs2(1); 61 for(int i=1;i<=m;i++){ 62 scanf("%d%d",&x,&y); 63 printf("%d\n",ask(x,y)); 64 } 65 return 0; 66 }
时间: 2024-10-10 23:48:58