计蒜客-子树结点个数

来源:互联网 发布:java属性签名是什么 编辑:程序博客网 时间:2024/06/05 05:41

相当于上一题的子问题
dfs即可
有一个棵树,树上有 nn 个结点。结点的编号分别为 1 \ldots n1…n,其中 11 是树的根结点。现在希望你帮忙计算每个结点作为根结点的子树分别有多少结点。

输入格式

第一行输入一个数字 nn,代表树上结点的个数。(2 \leq n \leq 10002≤n≤1000)接下来的 n-1n−1 行,每行俩个数字 aa,bb,代表结点 aa 到结点 bb 有一条边。

输出格式

按编号顺序输出每个结点作为根结点的子树,分别有多少结点,中间用空格分开。

样例输入

5
1 4
1 3
3 2
3 5
样例输出

5 1 3 1 1

#include<bits/stdc++.h>using namespace std;struct edge{    int v,next;}e[2007];int size[1007],p[1007],fa[1007],vst[1007],eid=0;void ins(int x,int y){    e[++eid].v=y;    e[eid].next=p[x];    p[x]=eid;}void ins2(int x,int y){    ins(x,y);    ins(y,x);}void dfs(int x){    size[x]=1;    for(int i=p[x];i;i=e[i].next){        if(e[i].v!=fa[x]){            fa[e[i].v]=x;            dfs(e[i].v);            size[x]+=size[e[i].v];        }    }}int main(){    int n;    scanf("%d",&n);    int x,y;    for(int i=1;i<n;i++){        scanf("%d%d",&x,&y);        ins2(x,y);    }    dfs(1);    for(int i=1;i<n;i++) cout<<size[i]<<' ';    cout<<size[n];    return  0;}
原创粉丝点击