PAT甲级解题笔记1079-dfs/树的遍历

题意:输入n,p,r,n是供应商个数,根供应商为0,p为从父节点买入价格,r为向子节点卖出价格增加的百分数,接下来n行:

第n行:K~i~ ID[1] ID[2] ... ID[K~i~]

K~i~ product

当K~i~不等于零,为第n个供应商卖出的对象即子节点数,接下来K~I~个ID为子节点编号。

当K~i~等于零,第n个编号为零售商,接下来的数为卖出产品数。

输出:零售商的总销售额,精确到小数点后一位

实现方法:

1.递归实现dfs

dfs(num[index].child[i],layer+1);

2.重点:结构体存储产品数int型和子节点vector型,再定义结构体型vector

3.当节点为叶节点,销售额增加,salesum += p * num[index].product*pow((1+r/100),layer);

注意:

1.输入n后num.resize(n),否则出错

2.销售额为double类型,输出格式为%.1f

3.r为百分数,需除100

#include<iostream>
#include<cmath>//pow函数
using namespace std;
#include<vector>

int n, ki, id,layer,i=0;
double p, r,salesum=0.0;
struct node//重点
{
	int product;
	vector<int> child;
};
vector<node> num;

void dfs(int index, int layer)
{
	if (num[index].child.size() == 0)
	{
		salesum += p * num[index].product*pow((1+r/100),layer);
		return;
	}
	for (int i = 0; i < num[index].child.size();i++)
	{
		dfs(num[index].child[i],layer+1);//递归
	}
}

int main(void)
{
	cin >> n >> p >> r;
	num.resize(n);//注意 否则报错
	for(int i=0;i<n;i++)
	{
		cin >> ki;
		if (ki > 0)
		{
			while (ki--)
			{
				cin >> id;
				num[i].child.push_back(id);
			}
		}
		else
		{
			cin >> num[i].product;
		}
	}
	dfs(0, 0);
	printf("%.1f", salesum);//小数点后一位
	system("PAUSE");
	return 0;
}

参考资料:https://www.liuchuo.net/archives/2212

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值