Tarjan求LCA模板
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tarjan求LCA模板相关的知识,希望对你有一定的参考价值。
1 int n,m,hcnt,qcnt; 2 int sx,sy; 3 struct Node{ 4 int to,next; 5 }node[maxn]; 6 struct Query{ 7 int x,ne; 8 int i; 9 }query[maxn<<1]; 10 int head[maxn],vis[maxn],indu[maxn]; 11 int fp[maxn],anc[maxn],que[maxn],ans[maxn<<1]; 12 int findp(int x){return fp[x]==x?x:fp[x]=findp(fp[x]);} 13 inline void add(int x,int y){ 14 node[hcnt].to=y;node[hcnt].next=head[x]; 15 head[x]=hcnt++; 16 } 17 inline void addq(int x,int y,int i){ 18 query[qcnt].x=x;query[qcnt].ne=que[y]; 19 query[qcnt].i=i;que[y]=qcnt++; 20 } 21 void Un(int x,int y){ 22 int xx=findp(x),yy=findp(y); 23 if(xx!=yy) fp[xx]=yy; 24 } 25 void dfs(int x){ 26 vis[x]=1; 27 fp[x]=x; 28 for(int i=head[x];~i;i=node[i].next){ 29 int e=node[i].to; 30 if(vis[e])continue; 31 dfs(e); 32 Un(x,e); 33 anc[findp(x)]=x; 34 } 35 for(int i=que[x];~i;i=node[i].next){ 36 int e=query[i].x; 37 if(vis[e]) 38 ans[query[i].i]=anc[findp(e)]; 39 } 40 } 41 int main(){ 42 int i,j,group,x,y; 43 scanf("%d",&group); 44 while(group--){ 45 mst(indu,0); 46 mst(head,-1); 47 mst(que,-1); 48 qcnt=hcnt=0; 49 mst(vis,0); 50 scanf("%d",&n); 51 for(i=1;i<n;++i){ 52 scanf("%d%d",&x,&y); 53 ++indu[y]; 54 add(x,y); 55 add(y,x); 56 } 57 int Q=1; 58 for(i=0;i<Q;++i){ 59 scanf("%d%d",&x,&y); 60 addq(x,y,i); 61 addq(y,x,i); 62 } 63 for(i=1;i<=n;++i) 64 if(!indu[i]){ 65 dfs(i); 66 break; 67 } 68 for(i=0;i<Q;++i) 69 printf("%d\n",ans[i]); 70 } 71 return 0; 72 }
以上是关于Tarjan求LCA模板的主要内容,如果未能解决你的问题,请参考以下文章
Tarjan 算法求 LCA / Tarjan 算法求强连通分量