树-一道编程题,用c++编程,求助

问题描述

一道编程题,用c++编程,求助
给定一颗无根树,假设它有n个节点,节点编号从1到n,求任意两点之间的距离之和,也就是求任意一点到其它点的距离之和,边长都为1。要求时间复杂度为O(n)

解决方案

先做一遍DFS求出所有节点到根节点的距离之和,然后可以发现,如果知道到一个点的距离之和,可以用O(1)求出所有节点到它相邻点的距离之和

解决方案二:

 /* ***********************************************Author        :xdloveCreated Time  :2016年05月17日 星期二 07时12分25秒File Name     :2016_05_17_51nod_1405.cpp************************************************ */#pragma comment(linker/STACK:102400000102400000"")#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <memory.h>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int N = 1e5 + 10;long long son[N]val[N];long long ans[N];struct Edge{    int vnext;}edge[N << 1];int head[N]tot;int n;void init(){    tot = 0;    memset(head-1sizeof head);}void addedge(int uint v){    edge[tot].v = v;    edge[tot].next = head[u];    head[u] = tot++;}void dfs(int uint pre){    son[u] = 1;    val[u] = 0;    for(int i = head[u]; i != -1; i = edge[i].next)    {        int v = edge[i].v;        if(v != pre)        {            dfs(vu);            son[u] += son[v];            val[u] += son[v] + val[v];        }    }}void dfsAgain(int uint pre){    ans[u] = val[u];    for(int &i = head[u]; i != -1; i = edge[i].next)    {        int v = edge[i].v;        if(v != pre)        {            long long tp = val[u] - val[v] - son[v];            val[v] += n - son[v] + tp;            dfsAgain(vu);        }    }}void solve(){    init();    cin >> n;    for(int i = 1; i <= n - 1; ++i)    {        int uv;        scanf(""%d %d""&u&v);        addedge(uv);        addedge(vu);    }    dfs(1-1);    dfsAgain(1-1);    for(int i = 1; i <= n; ++i)        printf(""%lld
""ans[i]);}int main(){    //freopen(""in.txt""r""stdin);    //freopen(""out.txt""w""stdout);    solve();     return 0;}

解决方案三:
【求助】一道考验脑细胞的编程题

时间: 2024-09-26 21:34:23

树-一道编程题,用c++编程,求助的相关文章

新手求助-一道编程题,能给个代码学习下么?

问题描述 一道编程题,能给个代码学习下么? AVL树是指左右子树的高度差不超过1,现在有一颗n个节点的AVL树,问这样的树有多少种.比如n为10,答案为60种,时间效率要求尽量高. 解决方案 递归问题,有一颗n个节点的AVL树有多少种可以转化为问已经有了一个根节点,求n-1个节点的AVL树有多少种 如果只有一个节点,那么只有1种. 解决方案二: 我在你前一个问题中给出思路了,你看看能不能懂,自己先尝试写下代码,这样才能提高你的编码能力,我有空帮你写个代码. 这是道动态规划题, 挺好的我觉得.

鼠标点击坐标-一道C++编程题 绘制三角形 鼠标响应 填充

问题描述 一道C++编程题 绘制三角形 鼠标响应 填充 求大神帮忙!!拜托!写一部分也行 解决方案 除了中国移动4G,我不知道你图上说的是什么 解决方案二: 你自己提问都不愿意把问题说清楚,就这个马虎的态度,还指望有人愿意帮你? 解决方案三: 不是的,是我手机的问题 解决方案四: 这个网站好像放不出来

ea编程-一道经典的EA编程题,你想挑战吗?

问题描述 一道经典的EA编程题,你想挑战吗? EA编程内容 品种:直盘外汇 时间周期:日线 入场信号做多: 条件1:当这个K线的收盘价高于左边第四根最高价时(以当下K线为参考从右往左数到第四根K线),收盘之后换线出现新K线. 分批建仓: A 换线之后立马开仓,建仓为0.2手. B,当换线后的K线回撤到前一根K线的1/2处,再次建仓为0.2手.(紧邻两根K线,以换线后这根K线为1,前一根K线为2,仅有当1这个K线回撤到2K线的1半才加仓,后市任何一根K线都不成立) C,当换线K线回撤到前一根K线的

求助两道关于c++循环的小编程题!

问题描述 求助两道关于c++循环的小编程题! 1.输入12个正整数,在去掉一个最小值和一个最大值后,求剩余10个正整数之和. 2.输入一个整数X(1<X<10),在屏幕上显示数字三角形.例如,X=5,显示: 1 121 12321 1234321 123454321 解决方案 1.简单的累加,记录最大最小值,然后减一下就可以了 #include "iostream" using namespace std; int main() { int max,min,sum=0,in

出现频率-一道C语言编程题,本人初学者,求大神解答

问题描述 一道C语言编程题,本人初学者,求大神解答 编写程序实现功能:数据文件story.txt是一篇英文小故事,请先统计其中26个字母的出现次数. 要求一:再根据用户要求,输出某个字母的出现次数,直到用户输入#为止. 要求二:请输出出现频率最高的三个字母和它们的出现次数. 解决方案 #include #include #include int main() { int alpha[26]={0}; //用于计数26个字母出现的次数 FILE *text; //FILE 指针 char ch;

刷华为上机题库时遇到的一道编程题

问题描述 刷华为上机题库时遇到的一道编程题 题目的要求是输入一个字符串,对字符串做如下变化1:按照A-Z的顺序条换顺序,不管字母的大小写.如Type变换为epTy2:同一个英文字母的大小写同时存在时,按照输入顺序排列.如输入:BabA?输出:aABb3:非英文字母的其它字符保持原来的位置.输入:By?e?输出:Be?y #include ""iostream""#include ""string""using namespac

内存-关于动态分配的编程题 求助!!!

问题描述 关于动态分配的编程题 求助!!! 第3题. 动态内存分配,指针数组,模拟函数的传引用调用 从键盘读取正整数n,然后读取n个单词,单词长度假设不会超过20.要求按照单词长度从小到大的顺序,输出单词. 要求:根据n动态创建一个长度为n的指针数组.每个单词存放在动态字符数组中. (1) 实现函数char ** readWords(int n),用于从键盘读取n个单词,保存在动态申请的字符数组中,字符数组首地址保存在动态申请的指针数组中.返回指针数组首元素的地址. (2) 实现函数void s

一道关于二叉树的编程题

问题描述 一道关于二叉树的编程题 给出一组整数对 { (a[0], b[0]), (a[1], b[1]) ... (a[n-1], b[n-1]) },所有 a 值 和 b 值分别不重复(任意 i != j 满足 a[i] != a[j] 且 b[i] != b[j]).构造一棵 n 结点的二叉树,将这 n 个整数对分配到各个结点上.根和所有子树满足以下条件: 1) 所有结点的 a 值满足二叉查找树的顺序,即 left->a < root->a && root->

内存管理-一道编程题用c语言实现这些功能时间有限1天时间求大神解答

问题描述 一道编程题用c语言实现这些功能时间有限1天时间求大神解答 有用户空间100kb,并规定作业的相应程序浇入内存连续区域,并不能被移动.作业与进程均采用sjf算法.输入为一组作业的进入时间,需要的内存容量(不超过100k)和运行时间. 要求: (1)按时间顺序给出每个作业的执行顺序,开始时间和结束时间,以及发生调度时内存各分区的状态: (2)计算这组作业的平均周转时间和平均带权周转时间: (3)实现作业一级调度和进程一级调度,包括调度算法和数据结构: (4)实现动态分区内存管理,包括内存分