计蒜客 子树的结点个数
问题回放
问题描述
有一个棵树,树上有 n 个结点。结点的编号分别为 1…n,其中 1 是树的根结点。现在希望你帮忙计算每个结点作为根结点的子树分别有多少结点。
输入格式
第一行输入一个数字 n,代表树上结点的个数。(2≤n≤1000)接下来的 n−1 行,每行俩个数字 a,b,代表结点 a 到结点 b 有一条边。
输出格式
按编号顺序输出每个结点作为根结点的子树,分别有多少结点,中间用空格分开。
样例输入
5
1 4
1 3
3 2
3 5
样例输出
5 1 3 1 1
问题分析
身为菜鸡的我,做了好久计蒜客,但只会做过于简单的题目找不到写的,今天总算遇见个自己可以写点东西的题
其实也不难
刚遇到这个题有点懵,以前做题都是拿个矩阵存起来(邻接表这东西大家都不喜欢吧)
可是问题来了怎么存啊,谁是父,谁是儿子,这是个误区,没有分清树和图的区别,树没有回路,如果从根节点dfs只能从父到子,所以就都存了一下,然后dfs,把路走出来;
搞个数用的是有返还值的dfs,第一次是想每做一次,把直接与子树根节点连接的边登记一下,然后多次dfs每次求一个点的子树节点,优化嘛,想到重复的计算太多,于是加了一个数组登记了一下,搞完收工。
我是菜鸡,刚开始接触算法,谢谢提意见,不要喷我
#include<stdio.h>
int n;
int t[1005][1005];