zoukankan      html  css  js  c++  java
  • 深度优先搜索(DFS)

    ①所谓深度搜索

     深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。

    翻译过来就是

    深度优先搜索是一种需要递归算法为基础的搜索方法,其递归边界就是找到答案或此通道已到尽头,则返回上一岔路口选择另外一条没有选择过的路,以此类推。

    如图所示,就像树分出的枝杈一样。

    之前考试的最后三题就需要DFS来解决

       http://ybt.ssoier.cn:8088/problem_show.php?pid=1199

    https://www.luogu.com.cn/problem/P1706

    https://www.cnblogs.com/TFLSc1908lzs/p/13535504.html
    ————————————————————————————————————————————————————————————————————————————————————————
    ②算法过程

    1.从根节点开始

    2.放入一个节点(起始时放入的为根节点)

    3.如果这个节点是第一次出现,则放入堆栈中

    4.判断该节点的子节点是否搜索完成,

            a.如果是则将该节点出栈,判断该栈是否为空

                 a.1 若为空则结束

                a.2 若不为空则取栈顶元素,并回到第2步

            b.如果没有完成搜索,取未被搜索的根节点,并回到第2步

    ③例题代码

    全排列代码

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,a[25];
     4 void dfs(int deep){//deep表示当前深度(已经经过几个岔路口
     5     if(deep==n+1){//递归边界,表示路到尽头
     6         for(int i=1;i<=n;i++)cout<<a[i]<<" ";//输出当前顺序
     7         cout<<endl;
     8         return;//返回上一岔路口
     9     }
    10     for(int i=1;i<=n;i++){
    11             a[deep]=i;//记录此岔路口选择
    12             dfs(deep+1);//下一个岔路口
    13     }
    14 }
    15 int main()
    16 {
    17     cin>>n;
    18     dfs(1);
    19     return 0;
    20 }

    结果如图

  • 相关阅读:
    luogu 1169 棋盘制作(单调栈/悬线)
    poj 2769 感觉♂良好 (单调栈)
    hdu 5033 buiding(单调栈)
    hdu1506 直方图中最大的矩形 单调栈入门
    有线电视网(树形dp)
    洛谷P1220 关路灯(区间dp)
    【题解】NOI2009二叉查找树 + NOIP2003加分二叉树
    【题解】AHOI2009中国象棋
    【算法】Matrix
    【题解】WC2008游览计划
  • 原文地址:https://www.cnblogs.com/TFLSc1908lzs/p/13658564.html
Copyright © 2011-2022 走看看