1. 程式人生 > >tarjan LCA模板

tarjan LCA模板

efi int namespace urn span void scanf 模板 ++

 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 }

tarjan LCA模板