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 }