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;
}
posted @ 2020-11-24 20:46  RioTian  阅读(215)  评论(0编辑  收藏  举报