B3860 [语言月赛 202309] pip install

题目介绍

题目描述

`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;
}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值