DFS:家谱

简介: DFS:家谱

计蒜客家谱(dfs求直系后代数)


       这一天蒜头君拿到了自己家的家谱,蒜头君便想知道,在自己家的家谱中,每位祖先有多少直系后代(直系后代包括他的孩子和他孩子的直系后代)。但是家族历史源远流长,家谱实在太庞大了,自己一个人完全数不过来。热心的你便自告奋勇帮蒜头君写一个程序,来统计每位祖先有多少直系后代。


输入格式


       输入的第一行有一个整数 n(1≤n≤100000),表示家谱中的总人数。


接下来读入 n−1 行,每行有两个整数 x(1≤x≤n), y(1≤y≤n),表示 x 是 y 的父母。


输出格式


       输出 n 行,每行有一个整数,表示第 i 个人有多少个直系后代。


样例输入


4


1 2


1 3


2 4


样例输出


3


1


0


0

#include <iostream>
#include <vector>
using namespace std;
vector<int> a[100005];   //建立100005个动态数组
bool b[100005];          //标记,用来寻找辈分最大的人
int n;
int ans[100005];
int dfs(int x){
  int res=0;            //直系后代的人数
  for(int i=0;i<a[x].size();i++){
    res+=dfs(a[x][i]);
  }                    //遍历自己第一代的儿女,继续调用该函数
  ans[x]=res;          //人数保存
  return res+1;        //每遇到一个加一
}
int main(){
  int x,y,root;
  cin>>n;
  for(int i=0;i<n-1;i++){
    cin>>x>>y;
    a[x].push_back(y);    //将x的第一代后辈插入一个动态数组中
    b[y]=1;               //标记,证明y不是父节点
  }
  for(int i=0;i<n-1;i++){
    if(!b[i]){
      root=i;         //寻找父节点的下标
    }
  }
  dfs(root);               //dfs一下
  for(int i=1;i<=n;i++){
    cout<<ans[i]<<endl;   //打印每个人的直系后代
  }
  return 0;
}

相关文章
|
6月前
|
算法
Hierholzer算法dfs找欧拉回路模板
Hierholzer算法dfs找欧拉回路模板
69 0
|
2月前
|
存储 算法 Java
【DFS(深度优先搜索)详解】看这一篇就够啦
本文介绍了深度优先搜索(DFS)算法及其应用。DFS从某个顶点出发,深入探索图的每条路径,直到无法前进为止,然后回溯。文章详细解释了DFS的基本思想,并通过示例图展示了其执行过程。此外,文中还探讨了三种枚举方式:指数型枚举、排列型枚举和组合型枚举,并提供了具体的代码实现。最后,文章通过几道练习题帮助读者更好地理解和应用DFS算法。
1514 19
【DFS(深度优先搜索)详解】看这一篇就够啦
|
6月前
|
存储 人工智能
贪心,DFS:小美的树上染色
贪心,DFS:小美的树上染色
71 1
|
6月前
|
算法
深度优先搜索(DFS)的基础理解与实现
深度优先搜索(DFS)的基础理解与实现
78 0
|
6月前
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
【每日一题Day318】LC1123最深叶节点的最近公共祖先 | dfs
34 0
|
机器学习/深度学习
抽象DFS:2N皇后
抽象DFS:2N皇后
|
机器学习/深度学习
抽象DFS:N皇后问题
抽象DFS:N皇后问题
|
算法 前端开发
怎么理解DFS和BFS
怎么理解DFS和BFS
171 0
|
机器学习/深度学习 C++
DFS经典问题——八皇后
DFS经典问题——八皇后
253 0
DFS经典问题——八皇后
|
存储 C++
C++实现图 - 02 图的遍历(DFS、BFS)
上一讲我们对图有了一个大概的了解,但是只讲了如何存储图,还没有讲如何遍历图。这一讲我们来介绍图的遍历方式,一共分为深度优先搜索(DFS)和宽度优先搜索(BFS)。
526 0
C++实现图 - 02 图的遍历(DFS、BFS)