①价格只与递归层数有关,不必单独为每个结点设置价格,放在相应的递归层,所有当层结点共用
②这种直接给出孩子结点的,用树的静态实现,题目中说不会形成环,每个经销商或林受伤都只对应一个供应商,初始供应商也就是生产者只有一个,这些说明他是科树。
③初始供应商价格是p,在执行dfs时不应该抬价。
#include<bits/stdc++.h>
using namespace std;
struct node{
vector<int> child;
int amount=0;
}n[100000];
double N,p,r,sum=0;
void dfs(int root,double price){
if(root!=0)
price=price*(r/100+1);
if(n[root].child.size()==0)
sum+=n[root].amount*price;
else{
for(int i=0;i<n[root].child.size();i++)//看起来是层次遍历,其实调用了递归,会一直查询到叶子,然后再返回查询同层次的别的结点,是个深度搜索
dfs(n[root].child[i],price);
}
}
int main(){
cin>>N>>p>>r;
for(int i=0;i<N;i++)
{
int temp;
cin>>temp;
if(temp==0){
cin>>n[i].amount;
}
else{
for(int j=0;j<temp;j++)
{
int t;
cin>>t;
n[i].child.push_back(t);
}
}
}
dfs(0,p);
printf("%.1lf",sum);
return 0;
}