zoukankan      html  css  js  c++  java
  • 虚树模板

      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
    ",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 }
  • 相关阅读:
    C++11多线程
    C++单例模式
    从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory
    云小课 | 云硬盘不用了如何处理?
    Kafka 源码解析:Server 端的运行过程
    带你掌握4种Python 排序算法
    面试官问我:如何减少客户对交付成果的质疑
    如何基于MindSpore实现万亿级参数模型算法?
    Go 接口类型
    Go 结构体
  • 原文地址:https://www.cnblogs.com/weeping/p/7698890.html
Copyright © 2011-2022 走看看