题目链接:功夫传人

这是一道非常基础的dfs题,从祖师爷到得到者;题目中给出了祖师爷是i = 0,就从0开始往下深搜,并且把功力值进行减弱,得到者没有徒弟,把得到者标记一下,如果遇到得到者就终止dfs,功力值放大一定的倍数。

#include<iostream>
#include<vector>

using namespace std;

const int N = 1e5 + 10;

int n,k,x;
double z,r;
vector<int > stu[N];
double ans;
bool st[N];

void dfs(int u,double sum){
    if(st[u]){
        ans += sum * stu[u][0];
        return ;
    }
    for(int i = 0; i < stu[u].size(); i ++ ){
        dfs(stu[u][i],sum * (1 - r /100));
    } 
}
int main() {
    scanf("%d %lf %lf",&n,&z,&r);
    for(int i = 0; i < n; i ++ ) {
        cin >> k;
        if(k == 0) {
            st[i] = true;
            cin >> x;
            stu[i].push_back(x);
        } else {
            while(k -- ) {
                cin >> x;
                stu[i].push_back(x);
            }
        }
    }
    dfs(0,z);
    cout<<(int)ans;
    return 0;
}