题目
浅浅的复习一下dfs,这个题就是用简单搜索,根据输入建树,记录树的深度,题目输入用vetor记录就行,map映射得道弟子的倍数vis数组找根节点
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
map<int,int>mp;
double ans=0;
double z,r;
vector<int>v[N];
bool vis[N];
bool dedao[N];
int p[N];
void dfs(int i,int deep){
if(dedao[i]) {
dedao[i]=0;
double dishu;
dishu=(1-0.01*r);
// cout<<i<<" "<<deep<<endl;
ans+=z*pow(dishu,deep)*mp[i];
}
for(int j=0;j<v[i].size();j++){
dfs(v[i][j],deep+1);
}
}
int main(){
int n;
int K,t;
int cnt=0;
cin>>n>>z>>r;
for(int i=0;i<n;i++){
cin>>K;
if(!K){
int x;
cin>>x;
mp[i]=x;
dedao[i]=1;
}
while(K--){
scanf("%d",&t);
vis[t]=1;
v[i].push_back(t);
}
}
int root;
for(int i=0;i<n;i++){
if(!vis[i]) {
root=i;break;
}
}
// for(int i=0;i<n;i++){
// cout<<dedao[i]<<" ";
// }
int deep=0;
dfs(root,deep);
printf("%.d",(int)ans);
return 0;
}