虚树模板
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define MP make_pair 6 #define PB push_back 7 typedef long long LL; 8 typedef pair<int,int> PII; 9 const double eps=1e-8; 10 const double pi=acos(-1.0); 11 const int K=1e6+7; 12 const int mod=1e9+7; 13 14 struct Edge 15 { 16 int v,nt; 17 Edge(){} 18 Edge(int x,int y){v=x,nt=y;} 19 }eg1[K],eg2[K]; 20 int tot1,tot2,hd1[K],hd2[K]; 21 inline void add(int u,int v,int op=0) 22 { 23 if(!op) 24 { 25 eg1[tot1]=Edge(v,hd1[u]),hd1[u]=tot1++; 26 eg1[tot1]=Edge(u,hd1[v]),hd1[v]=tot1++; 27 } 28 else 29 { 30 eg2[tot2]=Edge(v,hd2[u]),hd2[u]=tot2++; 31 eg2[tot2]=Edge(u,hd2[v]),hd2[v]=tot2++; 32 } 33 } 34 int dfc,dfn[K],up[K][22],deep[K]; 35 void dfs(int x,int f) 36 { 37 dfn[x]=++dfc,deep[x]=deep[f]+1,up[x][0]=f; 38 for(int i=1;i<=20;i++) up[x][i]=up[up[x][i-1]][i-1]; 39 for(int i=hd1[x];~i;i=eg1[i].nt) 40 if(eg1[i].v!=f) 41 dfs(eg1[i].v,x); 42 } 43 int lca(int x,int y) 44 { 45 if(deep[x]<deep[y])swap(x,y); 46 for(int i=20;i>=0;i--) 47 if(deep[up[x][i]]>=deep[y]) 48 x=up[x][i]; 49 if(x==y) return x; 50 for(int i=20;i>=0;i--) 51 if(up[x][i]!=up[y][i]) 52 x=up[x][i],y=up[y][i]; 53 return up[x][0]; 54 } 55 inline bool cmp(const int &x,const int &y) 56 { 57 return dfn[x]<dfn[y]; 58 } 59 int key[K],sk[K]; 60 void vrtr(int n,int *a) 61 { 62 tot2=0; 63 memset(hd2,-1,sizeof hd2); 64 int top=0; 65 sort(a+1,a+1+n,cmp); 66 for(int i=1;i<=n;i++) key[a[i]]=1; 67 for(int i=1;i<=n;i++) 68 { 69 if(!top) 70 { 71 sk[++top]=a[i];continue; 72 } 73 int f=lca(a[i],sk[top]); 74 while(dfn[f]<dfn[sk[top]]) 75 { 76 if(dfn[f]>=dfn[sk[top-1]]) 77 { 78 add(f,sk[top--],1); 79 if(sk[top]!=f) sk[++top]=f; 80 break; 81 } 82 else 83 add(sk[top-1],sk[top],1),top--; 84 } 85 sk[++top]=a[i]; 86 } 87 while(top>1) add(sk[top-1],sk[top],1),top--; 88 for(int i=1;i<=n;i++) key[a[i]]=0; 89 } 90 int q[K]; 91 void dfs2(int x,int f) 92 { 93 printf("%d\n",x); 94 for(int i=hd2[x];~i;i=eg2[i].nt) 95 if(eg2[i].v!=f) 96 dfs2(eg2[i].v,x); 97 } 98 int main(void) 99 { 100 memset(hd1,-1,sizeof hd1); 101 int n,m; 102 scanf("%d",&n); 103 for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),add(u,v); 104 scanf("%d",&m); 105 for(int i=1;i<=m;i++) scanf("%d",q+i); 106 dfs(1,0); 107 vrtr(m,q); 108 dfs2(1,0); 109 return 0; 110 }
作者:weeping
出处:www.cnblogs.com/weeping/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。