建立好树结构后,从根结点走一遍DFS,碰到 retailer 加上其商品的钱数即可
#include <iostream>
#include <cstdio>
#include <vector>
#include <functional>
using namespace std;
struct Node{
int id;
int amount;
vector<int> neighbor;
Node(){}
Node(int i, int a) : id(i), amount(a){}
};
int main(){
int n;
double p, r;
scanf("%d%lf%lf", &n, &p, &r);
vector<Node> nodes(n);
for(int i = 0; i < n; ++i){
int k, id, num;
scanf("%d", &k);
if(k == 0){
scanf("%d", &num);
nodes[i] = Node(i, num);
}else{
nodes[i] = Node(i, -1);
for(int j = 0; j < k; ++j){
scanf("%d", &id);
nodes[i].neighbor.push_back(id);
}
}
}
double sum = 0;
function<void(int, double)> dfs = [&](int src, double price){
if(nodes[src].amount != -1){
sum += price * nodes[src].amount;
return;
}
for(auto& n : nodes[src].neighbor){
dfs(n, price*(1+r/100));
}
};
dfs(0, p);
printf("%.1f", sum);
return 0;
}