题目大意:计算由 retailers(零售商), distributors(经销商), and suppliers(供应商)组成的树最终的销售额。其中,root supplier的节点编号是0,初始价格是p,每次向下一层,价格会增加 r%,直到叶子节点的 retailers,并给出所有retailers的销售量。
树的遍历问题,由于价格和层数有关系,dfs 和 bfs 都可以。
dfs代码:
#include <vector>
#include <cstdio>
using namespace std;
void dfs(int v, double &sum, double price, double r, vector<vector<int>> &tree, vector<double>& amount)
{
if(tree[v].size() == 0)
{
sum += price * amount[v];
return;
}
for (int i = 0; i < tree[v].size(); ++i)
{
dfs(tree[v][i], sum, price * (1 + r / 100), r, tree, amount);
}
}
int main()
{
int N;
double p, r;
scanf("%d%lf%lf", &N, &p, &r);
vector<vector<int>> tree(N);
vector<double> amount(N);
for (int i = 0; i < N; ++i)
{
int childNum;
scanf("%d", &childNum);
if(childNum > 0)
{
for (int j = 0; j < childNum; ++j)
{
int child;
scanf("%d", &child);
tree[i].push_back(child);
}
}
else scanf("%lf", &amount[i]);
}
double sum = 0;
dfs(0, sum, p, r, tree, amount);
printf("%.1f", sum);
return 0;
}
bfs代码:
#include <vector>
#include <cstdio>
#include <queue>
using namespace std;
void bfs(int root, double r, vector<double> &price, vector<vector<int>>& tree)
{
queue<int> q;
q.push(root);
while(!q.empty())
{
int now = q.front();
q.pop();
for (int i = 0; i < tree[now].size(); ++i)
{
price[tree[now][i]] = price[now] * (1 + r / 100);
q.push(tree[now][i]);
}
}
}
int main()
{
int N;
double p, r;
scanf("%d%lf%lf", &N, &p, &r);
vector<vector<int>> tree(N);
vector<double> price(N, p);
vector<double> amount(N, 0);
for (int i = 0; i < N; ++i)
{
int childNum;
scanf("%d", &childNum);
if(childNum > 0)
{
for (int j = 0; j < childNum; ++j)
{
int child;
scanf("%d", &child);
tree[i].push_back(child);
}
}
else scanf("%lf", &amount[i]);
}
bfs(0, r, price, tree);
double sum = 0;
for (int i = 0; i < N; ++i)
{
sum += amount[i] * price[i];
}
printf("%.1f", sum);
return 0;
}