【题意】给定一棵有根树,给定根的权z,从根开始遍历,每个节点的孩子的权都会变成原来的r%,如果这个节点在事先给定的序列rr里,那么他会把权值乘上rr[i]再传递给孩子。求编号在给定的序列里的节点的权值和。
【思路】DFS
自己的WA点,没搞好传递关系,写错了,一开始写的是从爹就开始判断儿子是不是特殊节点,如果是特殊节点就乘上个rr[爹],这完全搞混了好吧。
WA点2:最后输出的时候取整数部分cout<<floor(ans) wa了4分
printf("%.0lf",ans);AC
\
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
vector<int> g[100007];
int rd[100007],vis[100007];
double f[100007],rr[100007];
bool de[100007];
int n;
double z,r;
void dfs(int x){
vis[x]=1;
if(de[x]==true){
f[x]*=rr[x];
}
for(int i=0;i<g[x].size();i++){
int y=g[x][i];
if(vis[y])continue;
f[y]=f[x]*(1.0-r/100.0);
dfs(y);
}
}
int main(){
cin>>n>>z>>r;
rep(i,0,n-1){
int k;
cin>>k;
if(k==0){
int x;
cin>>x;
de[i]=true;
rr[i]=x;
continue;
}
map<int,int>mp;
rep(j,1,k){
int x;
cin>>x;
g[i].push_back(x);
}
}
f[0]=z;
dfs(0);
double ans=0;
rep(i,0,n){
if(de[i]){
ans+=f[i];
}
}
printf("%.0lf",floor(ans));
return 0;
}