这道题主要是考了对先驱节点的使用,详情看注释
#include<iostream>
using namespace std;
const int N=1e5+5;
int n;
double z,r,sum;
int pre[N],s[N];//pre存的是先驱节点,即pre[i]是i的师傅,s[i]存的是i得道者的倍数
double value[N];//存每个人的功力
double get_value(int x)
{
//在递归里输出注释掉的这几行,就会理解过程了
//cout<<"x="<<x<<"\n";
if (value[x]==0) {
//cout<<"pre["<<x<<"]="<<pre[x]<<"\n";
value[x]=(1.0-r/100)*get_value(pre[x]);
}
//cout<<"value["<<x<<"]="<<value[x]<<"\n";
return value[x];
}
int main()
{
cin.tie(0);
cin>>n>>z>>r;
value[0]=z;
for (int i=0;i<n;i++)
{
int k,id;
cin>>k;
if(!k) {
int beishu;
cin>>beishu;
s[i]=beishu;
}
else {
while (k--)
{
cin>>id;
pre[id]=i;
}
}
}
for (int i=0;i<n;i++)
{
if (s[i]) {
sum+=s[i]*1.0*get_value(i);
}
}
cout<<(int)sum;
return 0;
}