偏简单的题目
注意考虑N=1的特殊情况
用BFS求根叶距离(如果暴力从每个叶结点回溯的话会超时)
#include<stdio.h>
#include<math.h>
#include<vector>
#include<queue>
using namespace std;
int number[100005];
int lev[100005];
vector<int> vs[100005];
queue<int> q;
int main()
{
int n,num,j,i,x,y,l,sz;
double p,r;
scanf("%d%lf%lf",&n,&p,&r);
for(i=0;i<n;i++)
{
scanf("%d",&num);
if(num)
{
for(j=0;j<num;j++)
{
scanf("%d",&x);
vs[i].push_back(x);
}
}
else
{
scanf("%d",&x);
number[i]=x;
}
}
q.push(0);
while(!q.empty())
{
y=q.front();
sz=vs[y].size();
for(l=0;l<sz;l++)
{
lev[vs[y][l]]=lev[y]+1;
q.push(vs[y][l]);
}
q.pop();
}
double sum=0,per;
if(n==1)
{
sum=p*number[0];
printf("%.1lf\n",sum);
return 0;
}
for(i=0;i<n;i++)
{
if(number[i])
{
per=1+r/100;
sum+=pow(per,lev[i])*number[i];
}
}
sum*=p;
printf("%.1lf\n",sum);
return 0;
}