感动啊,时隔多年,我终于会dfs了!!
这道题当初背代码背得很难受,当初觉得真的是很难的一道题目,一直背代码,改代码,始终不得要领。现在终于会做了,知道这道题目的每一个注意点是什么了,我都很清楚,也算是真正理解并且熟练运用了dfs
- 你会发现一道题目,其实写的东西,代码量并不多,你读入数据就会占据很大一部分代码量,其实你自己写的不多
- dfs呢,你进形参的东西的其实就是你需要带进这个旅途的东西,就是会根据你的每一层会不断变化的东西。然后你放进形参中托管。如果一个东西它不会随着你每一层的进进出出而变化,那么你就不用带进去了。
- 然后你就信任你的dfs啦,它会给你把每一层需要的值都准备好,因为你已经托管给它了,所以它会帮你安排每一层你需要的值啦。就是如果是dfs的话,它是深度优先的搜索,就是说这个托管的值会反复横跳,先不断变深,然后再回回来。但是你可以放心,它在它应该在的那一层的数值一定是刚好那一层需要的。
- dfs的时候用auto挺好用的,而且更好理解。
- return 不是必须的,就像这一题,return 就不是必须的,删掉没有影响。
- dfs里面那个else是有影响的,很重要!!!!
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n;
double z,r,res;
vector<int> v[N];
bool dedaozhe[N];
void dfs(double gong,int root){
if(dedaozhe[root] == true ){
gong = gong * v[root][0];
res = res + gong;
return;
}
else{
for(auto it:v[root]){
dfs(gong * (100 - r)/100 , it);
}
}
}
int main(){
cin>>n>>z>>r;
int num;
for(int i=0;i<n;i++){
cin>>num;
if(num == 0){
dedaozhe[i] = true;
int k;
cin>>k;
v[i].push_back(k);
}
else{
while(num--){
int er;
cin>>er;
v[i].push_back(er);
}
}
}
dfs(z,0);
cout<<(int)res;
}