1 #include<vector> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 vector<int> child[100005]; //储存徒弟的容器 6 7 double z,r,sum; 8 double val[100005]; //判断是否得道者和储存得道者倍数 9 10 11 void f(int id,double w) //表示第id个人,w表示传承下来的功力值 12 { 13 if(val[id]){ //当倍数不为0,即是得道者,乘以倍数加到sum 14 sum=sum+w*val[id]; 15 }else{ 16 for(int i=0;i<child[id].size();i++){ 17 f(child[id][i],w*r); //把每个徒弟往下递归,传授给徒弟的功力值为w*r 18 } 19 } 20 return ; 21 } 22 int main() 23 { 24 memset(val,0,sizeof(val)); //初始化部分 25 sum=0; 26 27 int n,m,k; 28 scanf("%d %lf %lf",&n,&z,&r); 29 r=(100-r)/100; //题目为削弱r%,所以直接替换掉了 30 31 for (int i = 0; i < n; i++) { 32 scanf("%d",&m); //m来判断是否为得道者 33 34 if (!m) { //得道者,所以倍数储存到val[]里 35 scanf("%lf",&val[i]); 36 }else{ 37 for (int j = 0; j <m; j++) { //不是得道者,依序储存到child[]容器里 38 scanf("%d",&k); 39 child[i].push_back(k); 40 } 41 } 42 } 43 44 f(0,z); //递归遍历,从0号祖师爷开始,功力为z 45 46 printf("%d\n",(int)sum); //保留整数输出 47 48 return 0; 49 }