两种方法,从根结点开始,用DFS和BFS求树的高度
#include <iostream>
#include <vector>
#include <queue>
#include <math.h>
using namespace std;
struct Node
{
int id;
vector<int> child;
};
vector<Node> tree;
double BFS(int x, double p, double r)
{
queue<int> q;
q.push(x);
int height = 0;
double sum = 0;
while(!q.empty())
{
int n = q.size();
height++;
for(int i = 0; i < n; i++ )
{
int cur = q.front();
q.pop();
if(tree[cur].child.empty())
sum += tree[cur].id * p * pow(1+r*0.01, height-1);
for(int j = 0; j < tree[cur].child.size(); j++)
{
int next = tree[cur].child[j];
q.push(next);
}
}
}
return sum;
}
int main()
{
int n, k, a;
double p, r;
cin >> n >> p >> r;
for(int i = 0; i < n; i++)
{
scanf("%d", &k);
Node tmp;
if(k == 0)
{
scanf("%d", &a);
tmp.id = a;
}
else
{
tmp.id = i;
for(int j = 0; j < k; j++)
{
scanf("%d", &a);
tmp.child.push_back(a);
}
}
tree.push_back(tmp);
}
printf("%.1f\n", BFS(0, p, r));
return 0;
}
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
struct Node
{
int id;
vector<int> child;
};
vector<Node> tree;
vector<double> sum; //记录叶子节点的值
void DFS(int cur, double p, double r, int height)
{
if(tree[cur].child.empty())
{
double tmp = tree[cur].id * p * pow(1+r*0.01, height);
sum.push_back(tmp);
return;
}
for(int j = 0; j < tree[cur].child.size(); j++)
{
int next = tree[cur].child[j];
DFS(next, p, r, height+1);
}
}
int main()
{
int n, k, a;
double p, r;
cin >> n >> p >> r;
for(int i = 0; i < n; i++)
{
scanf("%d", &k);
Node tmp;
if(k == 0)
{
scanf("%d", &a);
tmp.id = a;
}
else
{
tmp.id = i;
for(int j = 0; j < k; j++)
{
scanf("%d", &a);
tmp.child.push_back(a);
}
}
tree.push_back(tmp);
}
DFS(0, p, r, 0);
double ans = 0;
for(int i = 0; i < sum.size(); i++)
ans += sum[i];
printf("%.1f\n", ans);
return 0;
}