[模板]树的重心

来源:互联网 发布:淘宝买机油靠谱吗 编辑:程序博客网 时间:2024/05/29 13:48
[模板]    求树的重心[任务]    求树的重心[接口]    vector<edge> way[maxn]  无向图    int siz[]               该节点的子节点个数(包括自己)    int mu[]                该节点的(最大,节点数最多)子树的节点数    allnode                 根节点的子节点个数 = siz(root)    int getroot(int u,int fa) 返回以u为根节点的子树的重心,fa为u的父节点(防止回去);    void dfsize(int u,int fa) 创建siz数组和mu数组(以u为根节点)    void dfsroot(int u,int fa,int allnode,int &root) 通过之前创建的siz数组和mu数组得到重心.(allnode = siz[u])[代码]void dfsize(int u,int fa){    siz[u] = 1;    mu[u] = 0;    for(int i=0;i<way[u].size();i++)    {        int t = way[u][i].to;        if(t == fa || vis[t] ) continue;        dfsize(t,u);        siz[u] += siz[t];        mu[u] = max(mu[u],siz[t]);    }}void dfsroot(int u,int fa,int allnode,int &root){    mu[u] = max(mu[u],allnode - siz[u]);    if(mu[u] < mu[root]) root = u;    for(int i=0;i<way[u].size();i++)    {        int t = way[u][i].to;        if(t!=fa && !vis[t]) dfsroot(t,u,allnode,root);    }}int getroot(int u,int fa){    int root = 0;    dfsize(u,fa);    dfsroot(u,fa,siz[u],root);    return root;}