树链剖分总结

来源:互联网 发布:梅西和c罗谁厉害 知乎 编辑:程序博客网 时间:2024/05/16 12:37


树链剖分的代码:

struct node{      int to,nxt;  }ed[maxn<<1];  int head[maxn],cnt;  void addedge(int u,int v){      ed[cnt].to=v;      ed[cnt].nxt=head[u];        head[u]=cnt++;  }  int sz[maxn],top[maxn],son[maxn],fa[maxn],dep[maxn],p[maxn];
 //sz[]树的size  top[]每个节点top的编号 son[]size最大的儿子 fa[]父亲节点 dep[]结点深度,p[]分后的编号 
int pos;  void dfs1(int u,int pre,int d){      fa[u]=pre;      sz[u]=1;      dep[u]=d;      for(int i=head[u];~i;i=ed[i].nxt){          int v=ed[i].to;          if(v==pre)continue;          dfs1(v,u,d+1);          if(son[u]==-1||sz[v]>sz[son[u]])son[u]=v;          sz[u]+=sz[v];      }  }  void dfs2(int u,int tp){      top[u]=tp;      p[u]=pos++;      if(son[u]==-1)return;      dfs2(son[u],tp);      for(int i=head[u];~i;i=ed[i].nxt){          int v=ed[i].to;          if(v==son[u]||v==fa[u])continue;          dfs2(v,v);      }  }
void init(){memset(head,-1,sizeof(head));memset(son,-1,sizeof(son));cnt=0;pos=1;}  


0 0
原创粉丝点击