返回目录
题意
给出一颗树根编号为0的树,树根处货物价格为p,从根节点往下一层,货物价格就要增加r%,再给出叶子结点的货物量,问所有叶子结点的价格之和。
样例(可复制)
10 1.80 1.00
3 2 3 5
1 9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3
//output
42.4
注意点
- 本题使用DFS和BFS都可以,下面的写法使用的是DFS,如果使用BFS,则可以考虑开两个queue < int >,一个记录编号,一个记录层数
- 本题node结构体中记录孩子节点使用vector而不用数组原因有二:①vector可以动态添加元素,不需要声明大小,如果使用数组,由于不知道最多的孩子结点个数,需要开比较大的空间,内存可能溢出。②vector自动修改和记录大小,不需要再使用一个变量记录孩子个数
#include<bits/stdc++.h>
using namespace std;
struct Node{
double data;
vector<int> child;
}node[100010];
int n,m,tmp;
double p,r,sum=0;
void DFS(int root,int depth){
if(node[root].child.size()==0){
sum+=node[root].data*pow(1+r,depth);
return;
}
for(int i=0;i<node[root].child.size();i++)DFS(node[root].child[i],depth+1);
}
int main(){
cin>>n>>p>>r;
r/=100;
for(int i=0;i<n;i++){
scanf("%d",&m);
if(m==0){
scanf("%lf",&node[i].data);
}else{
while(m--){
scanf("%d",&tmp);
node[i].child.push_back(tmp);
}
}
}
DFS(0,0);
printf("%.1f\n",p*sum);
return 0;
}