tarjan-LCA模板
洛谷P3379
1 #include <cstdio> 2 3 using namespace std; 4 5 const int max_n=5000050; 6 7 struct etype{ 8 int t,next; 9 }; 10 struct qtype{ 11 int t,next,id; 12 }; 13 14 etype e[2*max_n]; 15 qtype q[2*max_n]; 16 int a[max_n],b[max_n],ans[max_n],fa[max_n]; 17 bool vis[max_n]; 18 int cnt; 19 20 void addedge(int u,int v) 21 { 22 cnt++; 23 e[cnt].t=v;e[cnt].next=a[u];a[u]=cnt; 24 } 25 26 void addquery(int i,int u,int v) 27 { 28 cnt++; 29 q[cnt].t=v;q[cnt].id=i;q[cnt].next=b[u];b[u]=cnt; 30 } 31 32 int findfather(int k) 33 { 34 if (fa[k]==k) return k; 35 fa[k]=findfather(fa[k]); 36 return fa[k]; 37 } 38 39 void dfs(int k) 40 { 41 fa[k]=k;vis[k]=true; 42 int i=b[k]; 43 while (i>0) 44 { 45 if (vis[q[i].t]) 46 { 47 if (ans[q[i].id]==0) ans[q[i].id]=findfather(q[i].t); 48 } 49 i=q[i].next; 50 } 51 i=a[k]; 52 while (i>0) 53 { 54 if (!vis[e[i].t]) 55 { 56 dfs(e[i].t); 57 fa[e[i].t]=k; 58 } 59 i=e[i].next; 60 } 61 } 62 int main() 63 { 64 int n,m,s; 65 scanf("%d%d%d",&n,&m,&s); 66 for (int i=1;i<=n;i++) a[i]=0; 67 cnt=0; 68 for (int i=1;i<n;i++) 69 { 70 int x,y; 71 scanf("%d%d",&x,&y); 72 addedge(x,y);addedge(y,x); 73 } 74 for (int i=1;i<=n;i++) b[i]=0; 75 cnt=0; 76 for (int i=1;i<=m;i++) 77 { 78 int x,y; 79 scanf("%d%d",&x,&y); 80 addquery(i,x,y);addquery(i,y,x); 81 } 82 for (int i=1;i<=n;i++) vis[i]=false; 83 for (int i=1;i<=m;i++) ans[i]=0; 84 dfs(s); 85 for (int i=1;i<=m;i++) printf("%d\n",ans[i]); 86 return 0; 87 }