首页 > 其他分享 >501 距离和

501 距离和

时间:2024-10-10 17:02:07浏览次数:7  
标签:cnt idx int 距离 fa 节点 dp 501

// 501 距离和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*

http://oj.daimayuan.top/course/5/problem/224

有一棵 n个节点的树,节点编号从 1到 n。
请求出每个节点到其他所有节点的距离的和。

定义两个节点的距离为它们之间的简单路径上经过了多少条边。

输入格式
第一行一个整数 n表示节点数。

接下来 n−1行,每行两个整数 x,y表示 x号节点和 y号节点之间有一条边。


数据保证读入的是一棵树。

输出格式
输出共 n行,第 i行一个整数表示 i号节点到其他所有节点的距离的和。

样例输入
5
1 2
1 5
2 3
2 4
样例输出
6
5
8
8
9
数据规模
对于所有数据,保证 2≤n≤105,1≤x,y≤n。
*/


#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory.h>

using namespace std;

const int N = 100010;
long long dp[N], v[N], cnt[N];
int h[N], e[N*2], ne[N*2], idx;
int n;

void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void down(int u, int fa) {
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
        if (j == fa) continue;
        down(j, u);
        dp[u] += dp[j];
        cnt[u] += cnt[j];
    }
    dp[u] += cnt[u];
    cnt[u]++;
}

void up(int u, int fa) {
    if (fa != -1) {
        v[u] = v[fa] + dp[fa] - dp[u] - cnt[u] + n - cnt[u];
    }
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
        if (j == fa) continue;
        up(j, u);
    }
}


int main() {
    memset(h, -1, sizeof h);
    cin >> n;
    for (int i = 1; i <= n - 1; i++) {
        int a, b; cin >> a >> b;
        add(a, b); add(b, a);
    }

    down(1, -1);
    up(1, -1); 

    for (int i = 1; i <= n; i++) {
        cout << dp[i] + v[i] << endl;
    }
    
    return 0;
}

标签:cnt,idx,int,距离,fa,节点,dp,501
From: https://www.cnblogs.com/itdef/p/18456728

相关文章

  • Kingst 金思特 LA5016逻辑分析仪 简单入门使用
    前言:这里我仅简单介绍一下Kingst金思特LA5016逻辑分析仪简单入门使用这个软件的快熟上手使用,有补充的话后续在跟新。购买硬件和安装相关软件。软件直接官网下载即可连接如下:。需要说明的是不仅仅只是LA5016,软件同时也兼容其他版本。使用体验:这个Kingst金思特LA5016逻......
  • PTA 作业一 两分钟学会JAVA语言 7-4 Java程序设计-基本程序-计算两点之间的距离 提示
    7-4Java程序设计-基本程序-计算两点之间的距离分数10全屏浏览切换布局作者 万静单位 北京化工大学这是一个编程题模板。编写程序,提示用户输入两个点(x1,y1)和(x2,y2),然后显示两点间的距离。计算两点之间距离的公式是:注意可以使用Math.pow(a,0,5)计算。输入格式......
  • 平面最近点对 & 最小周长三角形 & 曼哈顿距离最近
    Statement求平面最近点对的距离,距离定义为欧几里德距离。Solution考虑按\(x\)排序,分治计算先往左右递归,设得到的答案为\(d\),当前算跨过中点的答案,那么答案\(\ged\)的点对可以不用枚举设中点为\(m\)对\(i\in[l..m]\),\(x_i\lex_m-d\)的不用枚举;对\(j\in[m+1..r]\)......
  • [Python手撕]二叉树两节点之间的距离
    classTreeNode:def__init__(self,value=0,left=None,right=None):self.value=valueself.left=leftself.right=rightdefparent(root,p,q):ifroot==porroot==q:returnrootleft,right=None,None......
  • USB和CAN都是用差分信号来传输数据,为什么CAN的传输距离能比USB远那么多?
    USB和CAN的区别今天在看USB项目设计实例的时候,突然想到一个问题,从而引发了一些思考。经过思考加上查阅资料,写出了这一篇文章作为记录。问题​ USB和CAN都是用两条线作为差分线以差分信号进行数据传输。总所周知,差分信号有着很强的抗干扰能力。那为什么USB的一般传输距离是5米......
  • 2289 马拉松 暴力枚举 曼哈顿距离
    解决思路 计算总距离:首先计算贝茜不跳过任何检查点的总行进距离。 尝试跳过每个检查点:对于每个可以跳过的检查点,计算跳过该检查点后的行进距离,并记录最小的行进距离。 输出结果:输出最小的行进距离。#include<bits/stdc++.h>#definelllonglongusingnamespac......
  • Hetao P2071 打字游戏 题解 [ 绿 ] [ 最小生成树 ] [ 动态规划 ] [ 编辑距离 ]
    打字游戏:MST套dp好题。首先看这个数据范围,\(O(n^4)\)把每两个字符串之前的编辑距离求一下很显然吧。然后我们观察一下每一个node的性质,发现他要么自己打完,要么从别人那里复制过来。这个就很像一棵树。建完树之后,我们就得到了一个森林。那么题目就转化为,求出一个边权之和......
  • Python和C++及MATLAB距离相关性生物医学样本统计量算法及数据科学
    ......
  • 【算法题】72. 编辑距离-力扣(LeetCode)
    【算法题】72.编辑距离-力扣(LeetCode)1.题目下方是力扣官方题目的地址72.编辑距离给你两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入:word1="ho......
  • COMM5501 Data Story Project
    Data Story Project GuideCOMM5501IntroductionThe major project for COMM5501 is structured to provide students a step-by-step guide to buildingtheir own data story on a topic of their own choosing, related to the UN Sustainab......