给出一颗销售供应树,根结点为0,在树根处售价为P,而后从根节点开始,每一层的货物的价格就会在上一层的价格上增长r%,给出每一个叶结点的货物量,要求计算全部叶结点的销售总额。node
此题本质上考察的是树的遍历,该树是由供应商做为根节点,经销商做为子节点,零售商做为叶子节点组成。想要求叶子节点的销售总额,只须要求出叶子节点的售价,为此,咱们只须要从根节点遍历该树,计算全部节点的售价,这样在遍历到叶子节点的时候就能够直接累计总售价。使用先序遍历或者层序遍历都是能够的,这里采用了先序遍历的方法,代码以下所示:算法
double total_sales = 0 ;// 总售价 void preTraverse(int root,double r){ if(node[root].child.empty()){ // 零售商,计算总售价 total_sales += node[root].price*node[root].total_amount; return; } double distributor_price = node[root].price*(1+r/100); for (auto &item:node[root].child){ node[item].price = distributor_price; preTraverse(item,r); } }
#include <cstdio> #include <vector> using namespace std; struct Node{ vector<int> child;//该结点的孩子 int total_amount;//叶子结点的货品数量 double price;//当前结点的售价 }node[100005]; double total_sales = 0 ;// 总售价 void preTraverse(int root,double r){ if(node[root].child.empty()){ // 零售商,计算总售价 total_sales += node[root].price*node[root].total_amount; return; } double distributor_price = node[root].price*(1+r/100); for (auto &item:node[root].child){ node[item].price = distributor_price; preTraverse(item,r); } } int main() { int N;//供应链总人数 double P,r;//供应商的单价,增量 scanf("%d %lf %lf",&N,&P,&r); int K,id; for (int i = 0; i < N; ++i) { scanf("%d",&K); if(i==0){ // 供应商 node[i].price = P; } if(K==0){ // 零售商 scanf("%d",&id); node[i].total_amount = id; } else { // 经销商和供应商 for (int j = 0; j < K; ++j) { scanf("%d",&id); node[i].child.push_back(id); } } } preTraverse(0,r); printf("%.1lf",total_sales); return 0; }