第一篇蒟蒻笔记(dfs)[大神请自动划走]

原本

小z是打算先写一篇关于字符串的笔记

由于实在是太太太太长了

我决定抛弃它(先丢进草稿箱

然后

这篇稍微正经一点的有关dfs的学习笔记就来辽(这是LDL老师才讲的内容

我来记录一下(记性不太好

语文太差,请多包涵

正文开始

 


 

dfs与回溯

 

Depth First Search

 

•  深度优先搜索概述

  –尽可能“深”的搜索某一分支。在深度优先搜
  索中,对于最先发现的结点,如果还有以此为
  起点的未搜索边,则沿此边继续搜索下去。当
  结点V的所有边都已经被探寻过,搜索将回溯
  到发现点V的那条边的始结点。重复此过程直
  至源结点可到达的所有结点为止。

 

•  回溯法概述

  –从问题的某一种状态出发, 搜索从这种状态出
  发所能达到的所有状态, 当这一条路走到“ 尽
  头 ”而没达到目标状态的时候, 再倒回上一个
  出发点, 从另一个状态出发, 继续搜索. 这种不
  断“走不通就回头”寻找解的方法, 称作“ 回
  溯法 ”。
  –回溯是搜索算法中的一种控制策略。
  –DFS利用的数据结构是栈(stack)。

 

•  回溯法的基本思想

  –为了求得问题的解,先选择某一种可能情况向
  前探索,在探索过程中,一旦发现原来的选择
  是错误的,就退回一步重新选择,并继续向前
  探索,如此反复进行,直至得到解或证明无解。
  –如迷宫问题:进入迷宫后,先随意选择一个前
  进方向,一步步向前试探前进,如果碰到死胡同,
  说明前进方向已无路可走,则返回一步,看看
  其它方向是否还有路可走;如果有路可走,则
  沿该方向再向前试探,如果仍然无路可走,就
  再返回一步看有无其他路可走。按此原则不断
  搜索回溯再搜索,直到找到出口或返回到入口
  处无解为止。

 

•  深度优先搜索/回溯法框架一

 

 1 void  dfs(当前状态){
 2     for (int   i =算符最小值; i<= 算符最大值; i++){
 3          算符i作用于当前状态,扩展出一个子状态;
 4          if ((子状态满足约束条件)&&子状态满足最优性要求)){     
 5              保存结果;
 6              if  (到目的地)  {   
 7                   if (当前状态为最佳目标状态)  记下最优结果;
 8                   return; //回溯 
 9              }
10              dfs(下一个状态);
11              恢复:保存结果之前的状态(回溯一步);
12         }
13     }
14 }                                   

 

 

•  深度优先搜索/回溯法框架二

 1 void  DFS(当前状态){   
 2     if  (当前状态为边界){
 3         if (当前状态为最佳目标状态)  记下最优结果;
 4         return//回溯 
 5     }
 6     for (int   i =算符最小值; i<= 算符最大值; i++){
 7         算符i作用于当前状态,扩展出一个子状态;
 8         if ((子状态满足约束条件)&&子状态满足最优性要求)){     
 9             保存结果;
10             DFS(下一个状态);
11             恢复:保存结果之前的状态(回溯一步)
12         }
13     }
14 }  

 

•  栈的操作(手写 / C++ stack)

  (上面是手写,下面是C++ stack)

 1 //栈的操作 
 2 
 3 //定义栈
 4 {
 5     int s[MAXN],top=0;
 6     
 7     stack<int>s;
 8 } 
 9 //进栈 
10 {
11     s[++top]=num;
12     
13     s.push(num);
14 } 
15 //出栈 
16 {
17     top--;
18     
19     s.pop();
20 }
21 //取栈顶元素
22 {
23     num=s[top];
24     
25     num=s.top();
26 } 
27 //求栈中元素个数
28 {
29     cnt=top;
30     
31     cnt=s.size();
32 } 
33 //判空 
34 {
35     if(top) return true;
36     else return false;
37     
38     s.empty();
39 }
40 //清空 
41 {    
42     top=0;
43     
44     while(!s.empty())
45         s.pop();
46 }

 

今天累了

就这样吧

如果有错误请私信我(今晚有一点迷糊

Good night.

 

——by_WBCAZ

 

 

posted @ 2022-10-07 22:05  WBCAZ  阅读(69)  评论(1)    收藏  举报