欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

# 深度优先搜索的理解

程序员文章站 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;
}

我也是一个小白希望接下来大家一起学习;