給出一顆銷售供應樹,根結點爲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; }