https://pintia.cn/problem-sets/994805342720868352/problems/994805388447170560
思路
只有到了叶子结点处才计算售价,深度或广度遍历都可以。深度遍历可以用当前层号计算价格,也可以用当前层价格计算;广度就是层序遍历
测试点
2356:float改用double
AC代码
含深度和广度两种方案
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct NODE {
double price,cnt_product;
vector<int> child;
} node[100001];
int num; //结点数量
double rate,price,sumprice=0; //涨价比例 成本价 售价总和
void level(){
queue<int> q;
int p=0;
q.push(p);
while (!q.empty()) {
p=q.front();q.pop();
if (node[p].child.size()==0) //叶结点计算售价
sumprice+=node[p].cnt_product*node[p].price;
for (int i=0; i<node[p].child.size(); ++i) {
int child=node[p].child[i];
node[child].price=node[p].price*(1.0+rate/100);
q.push(child);
}
}
}
void dfs(int index,double curprice) {
if (node[index].child.size()==0) { //叶结点计算售价
sumprice+=node[index].cnt_product*curprice;
return ;
}
for (int i=0; i<node[index].child.size(); ++i)
dfs(node[index].child[i],curprice*(1.0+rate/100));
}
int main(){
cin>>num>>price>>rate;
for (int i=0,childnum; i<num; ++i) {
cin>>childnum;
node[i].price=price;
node[i].no=i;
if (childnum==0) //叶结点时 后面跟的是产品数量
cin>>node[i].cnt_product;
else
for (int j=0,temp; j<childnum; ++j) {
cin>>temp;
node[i].child.push_back(temp);
}
}
dfs(0,price); //以初始价格为最初入口
// level();
printf("%.1lf",sumprice);
}