樹剖模板

void dfs1(int u,int pre,int step)
{
    dep[u]=step;
    fa[u]=pre;
    num[u]=1;
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v!=pre)
        {
            val[v] = edge[i].w;
            dfs1(v,u,step+1);
            num[u]+=num[v];
            if(son[u]==-1 || num[v]>num[son[u]])
            {
                son[u]=v;
            }
        }
    }
}
void dfs2(int u,int pre)
{
    top[u]=pre;
    p[u] = pos++;
    fp[p[u]]=u;
    if(son[u]== -1) return;
    dfs2(son[u],pre);
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].to;
        if(v!=son[u] && v!=fa[u])
        {
            dfs2(v,v);
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章