51nod 1405 树的距离之和

来源:互联网 发布:ip与mac绑定有什么缺点 编辑:程序博客网 时间:2024/05/11 02:21

这是一个树形dp的思想,两次dfs。

第一次dfs处理出,对于每个u,其所有子孙节点到其的距离之和。

第二次dfs处理出,对于每个u,所有点到其距离之和。

#include<iostream>#include<string.h>#include<string>#include<algorithm>#include<stdio.h>#include<vector>#include<set>#include<time.h>#define LL long long intusing namespace std;const int maxn = 120000;vector<int> G[maxn];LL sum[maxn];LL sz[maxn];LL save[maxn];int n;void init(){    memset(G,0,sizeof(G));    memset(sum,0,sizeof(sum));    memset(sz,0,sizeof(sz));    memset(save,0,sizeof(save));}LL dfs_1(int u,int fa){    LL ans = 0;    sz[u] = 1;    for(int i = 0;i<G[u].size();i++)    {        int v = G[u][i];        if(v == fa) continue;        ans += dfs_1(v,u);        ans += sz[v];        sz[u] += sz[v];    }    sum[u] = ans;    return ans;}void dfs_2(int u,int fa,LL up){    save[u] = sum[u] + up;    for(int i = 0;i<G[u].size();i++)    {        int v = G[u][i];        if(v == fa) continue;        dfs_2(v,u,up + n - sz[u] + sum[u] - sum[v] - sz[v] + sz[u] - sz[v]);        /*        next up = up + (n - sz[u]) + (sum[u] - sum[v] - sz[v]) + sz[u] - sz[v];        up是原来的up,肯定要加        对于u以上的所有节点,相当于所有的节点到他的距离+1,所以有n - sz[u]        对于u的子树,sum[u] - sum[v] - sz[v]是指(除了v以外的,其他子树的所有节点到u的距离和)        sz[u] - sz[v]是紧接着上一条的,因为u到v又推进了一条边,所以需要加一次长度        */    }}int main(){    while(cin >> n)    {        init();        for(int i = 0;i<n-1;i++)        {            int u,v;            scanf("%d %d",&u,&v);            G[u].push_back(v);            G[v].push_back(u);        }        dfs_1(1,-1);        dfs_2(1,-1,0);        for(int i = 1;i<=n;i++)        {            printf("%lld\n",save[i]);        }    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩香蕉吃多了怎么办 7个月宝宝缺钙怎么办 宝宝脖子被汗淹到红了脱皮怎么办? 小儿出汗多咳嗽怎么办吃什么 牛高烧不退怎么办最好 猪体温低不吃食怎么办 小孩发烧咳嗽怎么办吃什么药 大晚上发烧39度怎么办 胃受凉了老打嗝怎么办 大人发低烧怎么办如何退烧 吃了退热药不退热怎么办 猪持续高烧不退怎么办 猪感冒了不吃食怎么办 6岁儿童发烧38度怎么办 5岁儿童发烧38度怎么办 7岁儿童发烧38度怎么办 儿童发烧到38度怎么办 4岁儿童发烧38度怎么办 9岁儿童发烧38度怎么办 5儿童发烧38度怎么办 咳嗽了20多天怎么办 嘴角烂了怎么办涂什么药 感冒发烧到39度怎么办 6岁宝宝发烧头痛怎么办 生完孩子耻骨疼怎么办 顺产底下外阴红肿伤口流脓怎么办 产后便秘怎么办什么方法最有效 一周岁宝宝拉肚怎么办 三岁宝宝拉水怎么办 喝了过期的青汁怎么办 吃了黑心的苹果怎么办 新生儿两天没拉大便怎么办 贝亲奶瓶不漏怎么办 满月婴儿吃多了怎么办 婴儿吃撑了哭闹怎么办 新生儿吃撑了怎么办啊 新生儿吃了奶粉不吃奶怎么办 新生儿不吃奶也不吃奶粉怎么办 奶瓶吸奶费力不顺畅怎么办 宝宝吃奶粉太勤怎么办 香蕉和地瓜一起吃了怎么办