测试点2 的原因是没考虑只有一个根节点的情况;
我的思路就是用BFS遍历,不用递归是防止爆栈,感觉题目给的结点数量有点多,递归可能没戏。
附本人AC代码:
#include<iostream>
#include<vector>
#include<math.h>
#include<map>
#include<queue>
using namespace std;
vector<vector<int>>V;
int leavel[100011];
map<int, int>Ma;
int main() {
int N, num, id, val;
double P, r, ans = 0;
scanf("%d %lf %lf", &N, &P, &r);
V.resize(N);
for (int i = 0; i < N; i++) {
scanf("%d", &num);
if (num == 0) {
scanf("%d", &val);
Ma[i] = val;
}
else {
for (int j = 0; j < num; j++) {
scanf("%d", &id);
V[i].push_back(id);
}
}
}
queue<int>Q;
Q.push(0);
leavel[0] = 0;
while (Q.size() != 0) {
int t = Q.front();
Q.pop();
for (int i = 0; i < V[t].size(); i++) {
if (V[V[t][i]].size() == 0)
ans += (double)Ma[V[t][i]]*(double)P*(double)pow(1+0.01*r,(double)leavel[t]+1);
else {
leavel[V[t][i]] = leavel[t] + 1;
Q.push(V[t][i]);
}
}
}
if (N == 1)printf("%.1f", (double)Ma[0] * P);
else printf("%.1lf", ans);
return 0;
}