L2-020 功夫传人 (25分)
分析: ⽤⼆维数 组v存储师⻔谱系关系,v[i]表示编号为i的师傅所拥有的徒弟,如果徒弟个数等于0,
也就是说这是个得道者,那么v[i][0]保存放⼤的倍数,⽽且⽤visit[i] = true标记当前的这个编号的⼈是
得道者~⽤深度
优先搜索,每当遇到 visit[index] = true
也就是说这是个得道者的时候,就累加放⼤后的功⼒,power * v[index][0]
,累加到result中~遍历v[index]的所有弟⼦,并将功⼒减弱r%,也就是 power * (1 – r/100)
,最后输出的是result的整数值 (int)result
~~~
// Author : RioTian
// Time : 20/11/24
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
vector<vector<int>> v;
int visit[N], n, k;
double result, z, r;
void dfs(int index, double power) {
if (visit[index]) {
result += power * v[index][0];
return;
}
for (int i = 0; i < v[index].size(); ++i) {
dfs(v[index][i], power * (1 - r / 100));
}
}
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> z >> r;
v.resize(n);
for (int i = 0; i < n; ++i) {
cin >> k;
int tmp;
if (k == 0) {
cin >> tmp;
v[i].push_back(tmp);
visit[i] = true;
} else {
for (int j = 0; j < k; ++j) {
cin >> tmp;
v[i].push_back(tmp);
}
}
}
dfs(0, z);
cout << (int)result << endl;
}