tarjan LCA模板

 1 #include<cstdio>
 2 #include<iostream>
 3 #define MN 300000
 4 using namespace std;
 5 int n,m,w[MN],cnt,h[MN],q[MN];
 6 int s[MN],t[MN],fa[MN],dis[MN],a[MN];
 7 bool vis[MN];
 8 struct edge{int to,next;}e[MN*8];
 9 void ins(int *h,int u,int v){e[++cnt].to=v;e[cnt].next=h[u];h[u]=cnt;}
10 int ff(int x)={return fa[x]?fa[x]ff(fa[x]):x;}
11 void tarjan(int u){
12     vis[u]=true;
13     for(int i=h[u];i;i=e[i].next){
14         int v=e[i].to;
15         if(!vis[v]){
16             dis[v]=dis[u]+1; tarjan(v); fa[v]=u;
17         }
18     }
19     for(int i=q[u];i;i=e[i].next){
20         int v=e[i].to;
21         if(a[v]) a[v]=ff(a[v]);
22         else a[v]=u;
23     }
24 }
25 int main()
26 {
27     scanf("%d%d",&n,&m);
28     for(int i=1;i<n;i++){
29         int u,v; scanf("%d%d",&u,&v); ins(h,u,v);
30     }
31     for(int i=1;i<=n;i++) scanf("%d",&w[i]);
32     for(int i=1;i<=m;i++){
33         scanf("%d%d",&s[i],&t[i]); ins(q,s[i],i); ins(q,t[i],i);
34     }
35     tarjan(1);
36 }
原文地址:https://www.cnblogs.com/Beginner-/p/7596825.html