- 基本思路
用一个数组记录得道者功力值的倍数,再用一个bool数组标记该节点是否是得道者,还需要一个double数组记录功力值。最后bfs或者dfs来求得每个节点的功力值
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
bool is[N];
vector<int> edge[N];
int n,multiple[N],q[N];
double w[N];
bool vis[N];
double z,r;
double ans;
inline void dfs(int x){
vis[x]=true;
for(auto y:edge[x]){
if(!vis[y]){
w[y]=w[x]-(w[x]*r*0.01);
dfs(y);
}
}
}
inline void bfs(int s){
int front=1,rear=0;
q[++rear]=s;
vis[s]=true;
while(front<=rear){
int x=q[front];
++front;
for(auto y:edge[x]){
if(!vis[y]){
vis[y]=true;
w[y]=w[x]-(w[x]*r*0.01);
q[++rear]=y;
}
}
}
}
int main(){
cin>>n>>z>>r;
for(int i=0;i<n;i++){
int k; cin>>k;
if(k==0){
is[i]=true;
int id; cin>>id;
multiple[i]=id;
}else{
for(int j=1;j<=k;j++){
int x; cin>>x;
edge[i].push_back(x);
}
}
}
w[0]=z;
bfs(0);
for(int i=0;i<n;i++){
if(is[i])
ans+=w[i]*multiple[i];
}
cout<<(int)ans;
return 0;
}