zoukankan      html  css  js  c++  java
  • 子树的结点个数

    有一个棵树,树上有 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


    【分析】:为什么不用fa或者vis数组标记以免重复计算?因为这是有向图!那么只会往一个方向走。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5+10;
    const int INF = 0x3f3f3f3f;
    vector<int> G[maxn];
    int dfs(int cur) //dfs(cur)——>搜索cur为根的子树的结点
    {
        int cnt=1;
        for(int i=0;i<G[cur].size();i++)
        {
            cnt += dfs(G[cur][i]); //计算子数结点,cnt累加子孙点
        }
        return cnt;
    }
    int main()
    {
        int u,v;
        int n;
        cin>>n;
        for(int i=1;i<n;i++)
        {
            cin>>u>>v;
            G[u].push_back(v); //有向边
        }
        for(int i=1;i<=n;i++)
        {
            cout<<dfs(i)<<' '; //1~n每个结点作为根结点的子树,分别有多少结点
        }
    }
    
  • 相关阅读:
    Android ANR异常解决方案
    数据结构之斐波那契查找
    数据结构之插值查找
    数据结构之折半查找
    Android Task 任务
    java中“==”号的运用
    php中向前台js中传送一个二维数组
    array_unique和array_flip 实现去重间的区别
    js new Date() 获取时间
    手机端html5触屏事件(touch事件)
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9158088.html
Copyright © 2011-2022 走看看