小韦老师@神犇营-my1060-家谱

题目:

描述

家谱,又称族谱、宗谱等,是一种以表谱形式,记载一个家族的世系繁衍及重要人物事迹的书。皇帝的家谱称玉牒,如新朝玉牒、皇宋玉牒。它以记载父系家族世系、人物为中心,由正史中的帝王本纪及王侯列传、年表等演变而来。

家谱是一种特殊的文献,就其内容而言,是中国五千年文明史中具有平民特色的文献,记载的是同宗共祖血缘集团世系人物和事迹等方面情况的历史图籍。家谱属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。

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

输入

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

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

输出

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

输入样例1

4
1 2
1 3
2 4

输出样例1

3
1
0
0

题解:

思路

整体思路:

这个家谱是个特殊的有向图(其实是树,树就是一种特殊的图)。把这个图建好之后,枚举每个顶点,数当前这个顶点出发能遍历到的点的数量,即为题目所求。

主要步骤:

1、数据结构:

用一个 vector 数组作为邻接表存储图,例如 child[1] 这个 vector 存储的是 1 这个人的所有孩子也即可以认为是 1 这个顶点能到达的顶点:

 const int N = 3e4 + 10;vector<int> child[N];

2、输入并存储图的信息

 for (int i = 1; i < n; i++) {cin >> x >> y;child[x].push_back(y);  // x 是 y 的父母  }

3、调用 DFSTrave 函数(求得每个顶点的直系后代,并输出)

 DFSTrave();

4、实现 DFSTrave 函数,求得每个顶点的直系后代,并输出:

 void DFSTrave() {for (int u = 1; u <= n; u++) { // 枚举每个顶点 cnt = 0;  // 计数器归 0(用来数有多少个直系后代) DFS(u);  // 调用 DFS 函数,遍历所有 u 的直系后代 cout << cnt << endl;  // 输出直系后代的数量 }}

5、实现 DFS 函数,遍历所有 u 的直系后代:

 void DFS(int u) {// 枚举 u 的所有孩子 for (int v = 0; v < child[u].size(); v++) {DFS(child[u][v]);  // 递归对 u 的孩子调用 DFS cnt++;  // 直系后代数量加 1 }}

思考:

1°图和树有什么关系?

2°进一步地,图的线性表有什么关系?

3°这里的直系后代可以理解为一种认为定义的特殊的“连通块”吗?如果是,这里的“连通块”应该如何定义?

完整代码

#include <bits/stdc++.h>using namespace std;// 用一个 vector 数组作为邻接表存储图,例如 child[1] 这个 vector 存储的是 1 这个人的所有孩子
// 也即可以认为是 1 这个顶点能到达的顶点
const int N = 3e4 + 10;
vector<int> child[N];
int n, cnt;// 遍历所有 u 的直系后代
void DFS(int u) {// 枚举 u 的所有孩子 for (int v = 0; v < child[u].size(); v++) {DFS(child[u][v]);  // 递归对 u 的孩子调用 DFS cnt++;  // 直系后代数量加 1 }
}// 求得每个顶点的直系后代,并输出
void DFSTrave() {for (int u = 1; u <= n; u++) { // 枚举每个顶点 cnt = 0;  // 计数器归 0(用来数有多少个直系后代) DFS(u);  // 调用 DFS 函数,遍历所有 u 的直系后代 cout << cnt << endl;  // 输出直系后代的数量 }
}int main() {cin >> n;int x, y;// 输入并存储图的信息 for (int i = 1; i < n; i++) {cin >> x >> y;child[x].push_back(y);  // x 是 y 的父母}// 调用 DFSTrave 函数(求得每个顶点的直系后代,并输出) DFSTrave();return 0;
}

我是小韦老师,企者不立,跨者不行,每天进步一点点。

欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。邮箱:weichangying_wcy@163.com

小韦老师@神犇营-my1060-家谱相关推荐

  1. 小韦老师@神犇营-my0119-奥运奖牌计数

    小韦老师@神犇营-my0119-奥运奖牌计数 题目: 描述 2008 年北京奥运会,A 国的运动员参与了 n 天的决赛项目 (1 ≤ n ≤ 17). 现在要统计一下 A 国所获得的金.银.铜牌数目及 ...

  2. 小韦老师@神犇营-my0072-小码猿寄快递

    小韦老师@神犇营-my0072-小码猿寄快递 题目: 描述 小码猿要去寄快递,快递公司收费的标准如下: 5 千克(包括 5 千克)以内的价格为每千克 10.2 元,超过 5 千克的价格为每千克 7.5 ...

  3. 小韦老师@神犇营-my0060-捡石头

    小韦老师@神犇营-my0060-捡石头 题目: 描述 小码猿昨天捡了 3 块石头,每个石头的重量不同,如果这 3 块石头总的重量不足 100 斤,他要再去捡一块石头,让这 4 块石头的总重量正好是 1 ...

  4. 小韦老师@神犇营-my0008-请输出一首唐诗

    小韦老师@神犇营-my0008-请输出一首唐诗 题目: 请按照下面的格式输出这首唐诗,注意居中是用空格实现的.江南春唐 杜牧 千里莺啼绿映红, 水村山郭酒旗风. 南朝四百八十寺, 多少楼台烟雨中. 题 ...

  5. 小韦老师@神犇营-my1088-麻将游戏

    小韦老师@神犇营-my1088-麻将游戏 题目: 描述 在一种"麻将"游戏中,游戏是在一个有 w×h 格子的矩形平板上进行的.每个格子可以放置一个麻将牌,也可以不放(如图所示).玩 ...

  6. 神犇营-41-数字反转

    [小韦同学@神犇营-41-数字反转] 题目: 描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见 ...

  7. 神犇营-26-最大数输出

    [小韦同学@神犇营-26-最大数输出] 题目: 描述 输入三个整数,输出最大的数. 输入 输入为一行,包含三个整数,数与数之间以一个空格分开. 输出 输出一行,包含一个整数,即最大的整数. 输入样例1 ...

  8. 神犇营-my1085-面积

    [小韦同学@神犇营-my1085-面积] 题目: 描述 编程计算由 "" 号围成的下列图形的面积.面积计算方法是统计 * 号所围成的闭合曲线中水平线和垂直线交点的数目.如下图所示, ...

  9. 神犇营-49-人口增长问题

    [小韦同学@神犇营-49-人口增长问题] 题目: 描述 我国现有x亿人口,按照每年0.1%的增长速度,n年后将有多少人? 输入 一行,包含两个整数x和n,分别是人口基数和年数,以单个空格分隔. 输出 ...

最新文章

  1. 用Python分析北上广深租房情况,租房时优先考虑哪些因素?
  2. 微服务前端开发框架React-Admin
  3. php链接数据库实行增删查改_利用PHP连接数据库——实现用户数据的增删改查的整体操作实例...
  4. 2016-09-09
  5. 程序员的思维修炼》读书笔记
  6. 2020年云计算的十大新兴趋
  7. php 保护连接字符串,PHP OOP更新扩展类__construct上的受保护字符串
  8. 制图折断线_无锡春华教育AutoCAD家具制图/机械/工程制图
  9. 脱离微信,在硬件设备运行小程序?小程序硬件框架大揭秘!
  10. 产品经理面试技巧及常见问题
  11. 20.8 cace判断
  12. iphone手机铃声制作(iTunes)
  13. 头豹研究院发布《2022年中国数据库产品策略解析报告》
  14. LeetCode常用算法的总结
  15. AndroidStudio0.5.5发布
  16. 特异性敏感性的意义_敏感性特异性和有意义的分类
  17. 微信小程序驾考驾校考试预约信息管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】
  18. 狗狗叫c语言,原来狗狗“呜呜叫”有这些含义,主人:我总算看透它了
  19. 造轮子前先看看现有的开源轮子
  20. Java-jdk下载 (jdk1.6,jdk1.7,jdk1.8,jdk1.9,... 各个版本镜像下载)

热门文章

  1. python:使用scipy求解常微分方程
  2. rs232、rs422和rs485的特点与区别
  3. 用Python自动化办公能做到哪些有趣或有用的事情?
  4. 如何完美卸载pads 9.5/vx
  5. 欧姆龙r88d系列服务器说明书,欧姆龙R88D/R88M选型使用手册(中文)
  6. 星舟科技终止A股上市辅导,曾在新三板挂牌交易
  7. jewelcad教程(jewelcad教程下载)
  8. PCB Layout and SI 问答
  9. linux进程管理工具supervisor安装卸载、子配置文件详解、遇到的问题、supervisor group群组管理、启动一个springboot项目示例、update命令注意点
  10. 搞笑的百度贴吧神级回答(笑死我啦)