层序遍历,遍历到父节点时给出子节点所在层次即父节点层号加一,遍历到叶节点时把物品数量与价格(本零售商的价格)的乘积加到sum中
也可用深度遍历,递归时深度作参数
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
#define maxn 100000
struct node{
vector< int > children;
int isLeave= 0 ;
int amount;
int level;
} t[ maxn] ;
int n;
double price, rate;
int main ( ) {
cin>> n>> price>> rate;
for ( int i = 0 ; i < n; ++ i) {
int num;
cin>> num;
if ( num== 0 ) {
t[ i] . isLeave= 1 ;
cin>> t[ i] . amount;
continue ;
}
for ( int j = 0 ; j < num; ++ j) {
int child;
cin>> child;
t[ i] . children. push_back ( child) ;
}
}
double sum= 0 ;
node queue[ maxn] ;
int rear= 0 ;
int front= 0 ;
t[ 0 ] . level= 0 ;
queue[ rear++ ] = t[ 0 ] ;
while ( front!= rear) {
node temp= queue[ front++ ] ;
if ( temp. isLeave== 1 ) {
sum+ = price* temp. amount* pow ( 1.0 + rate/ 100.0 , temp. level) ;
continue ;
}
for ( int i = 0 ; i < temp. children. size ( ) ; ++ i) {
t[ temp. children[ i] ] . level= temp. level+ 1 ;
queue[ rear++ ] = t[ temp. children[ i] ] ;
}
}
printf ( "%.1f\n" , sum) ;
return 0 ;
}