Tarjan
#include<bits/stdc++.h> using namespace std; const int maxn=5e6+5; struct node { int v,index,next; node(){} node(int a,int b,int c) { index=a; v=b; next=c; } }; int N,M,S,cnt,qcnt; node query[maxn<<1],edge[maxn<<1]; int ans[maxn],fa[maxn],vis[maxn],head[maxn],qhead[maxn]; void tarjan(int s,int pre); int find(int p); void add(int i,int from,int to); void qadd(int i,int from,int to); int main() { fill(fa,fa+maxn,-1); fill(head,head+maxn,-1); fill(qhead,qhead+maxn,-1); int i,from,to; scanf("%d%d%d",&N,&M,&S); for(i=1;i<N;i++) { scanf("%d%d",&from,&to); add(0,from,to); add(0,to,from); } for(i=0;i<M;i++) { scanf("%d%d",&from,&to); qadd(i,from,to); qadd(i,to,from); } tarjan(S,-1); for(i=0;i<M;i++) printf("%d\n",ans[i]); system("pause"); return 0; } void add(int i,int from,int to) { edge[cnt]=node(i,to,head[from]); head[from]=cnt++; } void qadd(int i,int from,int to) { query[qcnt]=node(i,to,qhead[from]); qhead[from]=qcnt++; } int find(int p) { return fa[p]==-1?p:fa[p]=find(fa[p]); } void tarjan(int s,int pre) { int i,p; for(i=head[s];i!=-1;i=edge[i].next) { p=edge[i].v; if(p==pre) continue; tarjan(p,s); fa[p]=s; } vis[s]=1; for(i=qhead[s];i!=-1;i=query[i].next) { if(vis[query[i].v]) ans[query[i].index]=find(query[i].v); } }
ST
#include<bits/stdc++.h> using namespace std; const int maxn=500005; struct node { int v,next; node(){} node(int a,int b) {v=a;next=b;} }; node edge[maxn<<1]; int N,M,S,head[maxn],deep[maxn],st[maxn][20],cnt; void add(int from,int to); void dfs(int p,int pre); int lca(int u,int v); int main() { int a,b,i; fill(head,head+maxn,-1); scanf("%d%d%d",&N,&M,&S); for(i=1;i<N;i++) { scanf("%d%d",&a,&b); add(a,b); add(b,a); } dfs(S,0); for(i=0;i<M;i++) { scanf("%d%d",&a,&b); printf("%d\n",lca(a,b)); } system("pause"); return 0; } void add(int from,int to) { edge[cnt]=node(to,head[from]); head[from]=cnt++; } void dfs(int p,int pre) { int i; deep[p]=deep[pre]+1; st[p][0]=pre; for(i=1;(1<<i)<=deep[p];i++) st[p][i]=st[st[p][i-1]][i-1]; for(i=head[p];i!=-1;i=edge[i].next) { if(edge[i].v==pre) continue; dfs(edge[i].v,p); } } int lca(int u,int v) { int i; if(deep[u]!=deep[v]) { if(deep[u]<deep[v]) swap(u,v); for(i=19;i>=0;i--) { if(deep[st[u][i]]>=deep[v]) u=st[u][i]; } } if(u==v) return u; for(i=19;i>=0;i--) { if(st[u][i]!=st[v][i]) { u=st[u][i]; v=st[v][i]; } } return st[u][0]; }
来源:https://www.cnblogs.com/VividBinGo/p/12259264.html