题目介绍
题目描述
`pip install` 是 Python 安装包的重要指令。Python 的包具有依赖关系,在安装某些包之前,需要先安装这些包的依赖。
假定一共有依次编号为 1 - N 的N个包,第i个包共有 Ki 个依赖。现在,小 F 想要安装编号为1 的包。在完成 1 号包及其全部依赖的安装,一共安装了多少个包?
输入格式
输入共N+1行。
输入的第一行为一个正整数 N。
接下来 N 行,第i行描述了编号为i的包的依赖:
- 第i行共有 K_i+1个数。
- 第一个数为K_i。
- 接下来 K_i个数,描述了所依赖的包的编号。
输出格式
输出一行一个整数,表示安装的包的数量。
思路
一道很典型的递归题
假设 1 包依赖 2 ,3 ,4,那么我们就需要完成他们的依赖
这时我们又要完成2,3,4的依赖
递归边界
当完成一个包的所有依赖时,便可以返回退出
递归函数
用ap_b数组来表式需要下载的包
ap数组存储包的依赖
void check(int n) {
for (int i = 1; ap[n][i]; i++)//遍历所有依赖包
{
if (ap_b[ap[n][i]])continue;//如果已经处理了依赖则直接跳过
ap_b[ap[n][i]] = true;//需要下载
check(ap[n][i]);//递归
}
}
注意:如果已经处理完毕,就跳过(continue),不然时间会爆
主函数部分
memset(ap_b, 0, sizeof(ap_b));
可以先用memset初始化一下
ap_b[1] = true;
由题目(第一个包)所以把第一个包下载(ap_b = true)
for (int i = 1; i <= n; i++) {
int p;
cin >> p;
for (int j = 1; j <= p; j++) {
cin >> ap[i][j];
}
}//输入每一个包的依赖
输入包的依赖
check(1);//递归
long long ans = 0;
for (int i = 1; i <= 1000000; i++) {
if (ap_b[i])ans++;
}//遍历ap_b数组,就可以算出数量
cout << ans << endl;//直接输出
直接调用函数输出即可
完整代码
#include<bits/stdc++.h>
using namespace std;
int ap[6000][6000];
bool ap_b[100000];
void check(int n) {
for (int i = 1; ap[n][i]; i++)
{
if (ap_b[ap[n][i]])continue;
ap_b[ap[n][i]] = true;
check(ap[n][i]);
}
}
int main() {
memset(ap_b, 0, sizeof(ap_b));
ap_b[1] = true;
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int p;
cin >> p;
for (int j = 1; j <= p; j++) {
cin >> ap[i][j];
}
}//输入每一个包的依赖
check(1);//递归
long long ans = 0;
for (int i = 1; i <= 100000; i++) {
if (ap_b[i])ans++;
}//遍历ap_b数组,就可以算出数量
cout << ans << endl;//直接输出
return 0;
}