小韦老师@神犇营-my1060-家谱_小韦同学的博客-程序员秘密

技术标签: 家谱    小韦同学@题解:神犇营    信奥  

小韦老师@神犇营-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;
}

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31790997/article/details/103511545

智能推荐

使用Docker Compose容器化Ruby on Rails应用程序进行开发_cukw6666的博客-程序员秘密

介绍 (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...

MySQL面试------收藏篇_奋斗小亮的博客-程序员秘密

学习链接:100道MySQL常见面试题总结写给 Java 程序员的 24 个MySQL面试题,拿走不谢!写给 Java 程序员的 24 个MySQL面试题,拿走不谢! 转MySQL经典面试题玩转Mysql系列 - 第24篇:如何正确的使用索引?...

FC-SAN、IP-SAN(iscsi)、NAS区别_weixin_34279061的博客-程序员秘密

FC-SAN和IP-SAN两者的优缺点分别是什么?一般来说,企业在面临iSCSI SAN存储解决方案时,多半喜欢拿FC SAN及NAS与其做一番比较。在此先就FC与iSCSI做一比较,基本两者同属走Block协议的SAN架构,只不过前者透过光纤,后者藉由IP传输数据罢了,而两者在管理及应用上也大同小异,其间只不过优劣好坏的差异。至于SAN与NAS的差异而言,笔者走访了...

说说高斯过程回归_weixin_34008784的博客-程序员秘密

说说高斯过程回归作者介绍:新浪微博ID @妖僧老冯, 9月将赴南京大学(直博生),方向是机器学习与数据挖掘编者:小便和作者打过几次交道,一直以为是他是已“修成正果”的某某博士,便“毕恭毕敬”地去邀请他写篇牛文。细聊之后才得知小伙子原来是90后,9月份才博士入学。这篇文章对GP进行了深度科普,数学公式是有一些的,但耐心读读,都不是问题的。高斯过程是机器学习领域一个基础的方法,同时又和其他方法...

随便推点

node-webkit中使用sqlite3(含编译教程)_node sqlite3 重新编译_carfge的博客-程序员秘密

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...

UVA 1630 Folding_DS-K的博客-程序员秘密

题目链接:http://acm.hust.edu.cn/vjudge/problem/51191题意:给一个字符串,相同部分可以折叠,折叠可以嵌套。求最短长度的一种折叠方法。括号和数字的长度也要考虑进去。思路:对于一个字符串,有三种策略:1、不折叠。2、本身可以折叠。3、分为两个区间子问题。#include #include #include #inclu

maven module 路径_【Maven】使用Maven构建多模块项目_weixin_39938855的博客-程序员秘密

Maven多模块项目Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。项目结构如下:test-hd-parent  (父级)---pom.xml---test-hd-api    (第三方接口层)----pom.xml---test-hd-found...

POI-实现导入导出_青岛欢迎您的博客-程序员秘密

界面展示:导出导出.png导入导入.png开发步骤:1、首先导入poi.jar包(注意:我用的是3.8版本的jar包,其他版本的没试过应该也可以)poi所需的jar包.png2、在list.jsp列表显示界面添加两个按钮导入导出 &amp;lt;tr&amp;gt; &amp;lt;td colspan=&quot;21&quot;&amp;gt; ...

使用 vscode 安装配置 clang-format(代码格式化)_vscode clang format-程序员秘密

使用 vscode 配置安装 clang-format。assume-filename 怎么用?为您 揭晓RawStringFormats 是什么项?看同专栏。vscode 使用 clang-format 无法生效?

推荐文章

热门文章

相关标签