虚树模板

  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 }

 

posted @ 2017-10-20 12:33  weeping  阅读(323)  评论(1编辑  收藏  举报