ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

点分治

2022-07-04 12:36:21  阅读:153  来源: 互联网

标签:rt 子树 int siz 分治 son kid


int siz[Z], kid[Z], root, size;//kid[rt]:该点的最大子树的大小
bool vs[Z];
void getroot(int rt, int fa)//求树的重心
{
    siz[rt] = 1, kid[rt] = 0;
    for (re i = head[rt]; i; i = e[i].ne)
    {
        int son = e[i].v;
        if (vs[son] || son == fa) continue;
        getroot(son, rt);
        siz[rt] += siz[son];
        kid[rt] = max(kid[rt], siz[son]);
    }
    kid[rt] = max(kid[rt], size - siz[rt]);//除rt子树之外的其他剩余节点也可以转化为rt的子树
    if (kid[rt] < kid[root]) root = rt;//最大子树最小的点为树的重心
}
void solve(int rt)
{
    vs[rt] = 1;
    calc(rt);
    for (re i = head[rt]; i; i = e[i].ne)
    {
        int son = e[i].v;
        if (vs[son]) continue;
        kid[root = 0] = n;
        size = siz[son];//子树大小
        getroot(son, 0);//寻找子树的重心
        solve(root);//递归处理子树
    }
}

int dis[Z], rec[M];
bool be[M];//桶记录
void getdis(int rt, int fa)//点到根的距离
{
    rec[++rec[0]] = dis[rt];//临时记录当前子树中的dis
    for (re i = head[rt]; i; i = e[i].ne)
    {
        int son = e[i].v;
        if (vs[son] || son == fa) continue;
        dis[son] = dis[rt] + e[i].w;
        getdis(son, rt);
    }
}
void calc(int rt)//统计答案,因题而异
{
    memset(be, 0, sizeof(be));
    be[0] = 1;//rt--rt的dis
    for (re i = head[rt]; i; i = e[i].ne)
    {
        int son = e[i].v;
        if (vs[son]) continue;
        dis[son] = e[i].w; rec[0] = 0;//初始化
        getdis(son, rt);
        for (re j = 1; j <= rec[0]; j++)//遍历子树dis
            for (re t = 1; t <= m; t++)
                if (k[t] >= rec[j])//该路径存在
                    ans[t] |= be[k[t] - rec[j]];
        for (re j = 1; j <= rec[0]; j++) be[rec[j]] = 1;//保存已有dis
    }
}

 

标签:rt,子树,int,siz,分治,son,kid
来源: https://www.cnblogs.com/zsj11337/p/16442344.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有