技术标签: 家谱 树 小韦同学@题解:神犇营 图 信奥
家谱,又称族谱、宗谱等,是一种以表谱形式,记载一个家族的世系繁衍及重要人物事迹的书。皇帝的家谱称玉牒,如新朝玉牒、皇宋玉牒。它以记载父系家族世系、人物为中心,由正史中的帝王本纪及王侯列传、年表等演变而来。
家谱是一种特殊的文献,就其内容而言,是中国五千年文明史中具有平民特色的文献,记载的是同宗共祖血缘集团世系人物和事迹等方面情况的历史图籍。家谱属珍贵的人文资料,对于历史学、民俗学、人口学、社会学和经济学的深入研究,均有其不可替代的独特功能。
这一天小码猿拿到了自己家的家谱,小码猿便想知道,在自己家的家谱中,每位祖先有多少直系后代(直系后代包括他的孩子和他孩子的直系后代)。但是家族历史源远流长,家谱实在太庞大了,自己一个人完全数不过来。热心的你便自告奋勇帮小码猿写一个程序,来统计每位祖先有多少直系后代。
输入的第一行有一个整数 n( 1 ≤ n ≤ 30000),表示家谱中的总人数。
接下来读入 n - 1 行,每行有两个整数 x, y(1 ≤ x, y ≤ n),表示 x 是 y 的父母。
输出 n 行,每行有一个整数,表示第 i 个人有多少个直系后代。
4
1 2
1 3
2 4
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;
}
我是小韦老师,企者不立,跨者不行,每天进步一点点。
欢迎大家多多交流,如果发现有错误,请多指正。有疑问的同学也可以留言评论或者发邮件。邮箱:[email protected]
介绍 (Introduction)If you are actively developing an application, using Docker can simplify your workflow and the process of deploying your application to production. Working with containers in develo...
学习链接:100道MySQL常见面试题总结写给 Java 程序员的 24 个MySQL面试题,拿走不谢!写给 Java 程序员的 24 个MySQL面试题,拿走不谢! 转MySQL经典面试题玩转Mysql系列 - 第24篇:如何正确的使用索引?...
FC-SAN和IP-SAN两者的优缺点分别是什么?一般来说,企业在面临iSCSI SAN存储解决方案时,多半喜欢拿FC SAN及NAS与其做一番比较。在此先就FC与iSCSI做一比较,基本两者同属走Block协议的SAN架构,只不过前者透过光纤,后者藉由IP传输数据罢了,而两者在管理及应用上也大同小异,其间只不过优劣好坏的差异。至于SAN与NAS的差异而言,笔者走访了...
node安装及环境变量配置
说说高斯过程回归作者介绍:新浪微博ID @妖僧老冯, 9月将赴南京大学(直博生),方向是机器学习与数据挖掘编者:小便和作者打过几次交道,一直以为是他是已“修成正果”的某某博士,便“毕恭毕敬”地去邀请他写篇牛文。细聊之后才得知小伙子原来是90后,9月份才博士入学。这篇文章对GP进行了深度科普,数学公式是有一些的,但耐心读读,都不是问题的。高斯过程是机器学习领域一个基础的方法,同时又和其他方法...
node-webkit中使用sqlite3sqlite3的官方文档提到:nodejs和node-webkit的ABI不同,所以通过npm install sqlite3下载的sqlite3是无法使用的,需要重新编译。windows编译:以LTS版本(0.14.7)为例一、所需编译环境安装Python 2.7.14(不支持3.x版本)并设置好环境变量,下载地址:https://www.python.org/downloads/ 安装最新的nodejs+npm 下载地址:https...
题目链接:http://acm.hust.edu.cn/vjudge/problem/51191题意:给一个字符串,相同部分可以折叠,折叠可以嵌套。求最短长度的一种折叠方法。括号和数字的长度也要考虑进去。思路:对于一个字符串,有三种策略:1、不折叠。2、本身可以折叠。3、分为两个区间子问题。#include #include #include #inclu
Maven多模块项目Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。项目结构如下:test-hd-parent (父级)---pom.xml---test-hd-api (第三方接口层)----pom.xml---test-hd-found...
界面展示:导出导出.png导入导入.png开发步骤:1、首先导入poi.jar包(注意:我用的是3.8版本的jar包,其他版本的没试过应该也可以)poi所需的jar包.png2、在list.jsp列表显示界面添加两个按钮导入导出 &lt;tr&gt; &lt;td colspan="21"&gt; ...
使用 vscode 配置安装 clang-format。assume-filename 怎么用?为您 揭晓RawStringFormats 是什么项?看同专栏。vscode 使用 clang-format 无法生效?