# 深度优先搜索的理解
程序员文章站
2022-06-11 11:11:27
...
深度优先搜索的理解
类似与迷宫,当碰到了一个岔路口的时候,总是以深度作为前进的关键词,不碰到死活同就一直不回头,这便是深度优先搜索(Depth First Search,DFS)深度搜索是以一种枚举的方法进行。使用递归可以很好的使用深度优先搜索,递归是深度优先搜索的一种方式,使用递归的时候系统会自动调出系统栈,存放递归中每一层的状态,使用递归来实现DFS本质就是栈;
比如PTA上有关于这样的例题
功夫传人
一门武功能否传承久远并被发扬光大,是要看缘分的。一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱…… 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹、挖到了特别的秘笈),会将功夫的威力一下子放大N倍 —— 我们称这种弟子为“得道者”。
这里我们来考察某一位祖师爷门下的徒子徒孙家谱:假设家谱中的每个人只有1位师傅(除了祖师爷没有师傅);每位师傅可以带很多徒弟;并且假设辈分严格有序,即祖师爷这门武功的每个第i代传人只能在第i-1代传人中拜1个师傅。我们假设已知祖师爷的功力值为Z,每向下传承一代,就会减弱r%,除非某一代弟子得道。现给出师门谱系关系,要求你算出所有得道者的功力总值。
在这里就所需要用的就是DFS进行深搜直到找到师傅为止;
以下是所题目所需要的代码
#include<bits/stdc++.h>
using namespace std;
vector<int>sk[100000];
int sg[100000];
double a,b;
double dfs(int x,int y){
double aa=0;
if(sk[x].size()==0)aa+=sg[x]*a*pow(1-b/100,y);
else{
for(int i=0;i<sk[x].size();i++){
aa+=dfs(sk[x][i],y+1);
}
}
return aa;
}
/*利用dfs即递归的思想来解题对于徒弟,得道者往上依次查找
之道查找到为0时,看有多少次需要*r%再将其进行计算,如果部位0
返回往上一级,直到为0,进行计算*/
int main(){
int n,c,d;
cin>>n>>a>>b;
for(int i=0;i<n;i++){
cin>>c;
if(c){
for(int j=0;j<c;j++){
cin>>d;
sk[i].push_back(d);
}
}
else{
cin>>sg[i];
}
}
cout<<(int)dfs(0,0);
return 0;
}
我也是一个小白希望接下来大家一起学习;