原题目: 1106 Lowest Price in Supply Chain (25 分).
题意
给出供应链成员个数n(0~n-1)以及根供应商的价格P和提价率r,接着给出0-(n-1)供应商的直接经销商或零售商总数及其ID(第0个供应商为根供应商);其中,若ID为0则该供应商实为零售商。
① 计算出最低售价,
② 以及这样的零售商的个数,精确到4位小数。
即提供一棵树,在树根处货物的价格为P,从根结点开始每往下一层,该层货物价格将会在父结点的价格上增加r%,求叶子结点中能获得的最低价格以及能提供最低价格的叶子节点数。
分析
- 同 👉传送门:1090 Highest Price in Supply Chain (25 分)
- 多个 剪枝(递归时由于某条件可以提前返回上一层)——因为是找最小深度,故递归到超出当前已知最小深度的分支可以提前结束。
CODE
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<int> v[1000005];
int mindepth = 99999999, minnum = 1; //欲找到最小深度及其结点数
void DFS(int root, int depth);
int main()
{
int n, k, c;
double p, r;
cin >> n >> p >> r;
for ( int i=0; i<n; i++ ){
cin >> k;
for ( int j=0; j<k; j++ ){
cin >> c;
v[i].push_back(c); //孩子结点
}
}
//找最小深度及该层次结点数
DFS(0, 1);
//计数结果
double minprice = p * pow(1+r/100, mindepth-1);
printf("%.4f %d", minprice, minnum);
return 0;
}
void DFS(int root, int depth){
if ( mindepth<depth )
return; //剪枝:更深的不必遍历完了——提前下班!
if ( v[root].size()==0 ){ //叶结点
if ( mindepth==depth )
minnum++; //计算最小层次结点数
else if ( mindepth>depth ){ //出现更小深度
mindepth = depth;
minnum = 1; //重新计数
}
return;
}
for ( int i=0; i<v[root].size(); i++ )
DFS(v[root][i], depth+1); //深度优先递归遍历每个结点的孩子结点
}