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 }

    结果如图

  • 相关阅读:
    积水路面Wet Road Materials 2.3
    门控时钟问题
    饮料机问题
    Codeforces Round #340 (Div. 2) E. XOR and Favorite Number (莫队)
    Educational Codeforces Round 82 (Rated for Div. 2)部分题解
    Educational Codeforces Round 86 (Rated for Div. 2)部分题解
    Grakn Forces 2020部分题解
    2020 年百度之星·程序设计大赛
    POJ Nearest Common Ancestors (RMQ+树上dfs序求LCA)
    算法竞赛进阶指南 聚会 (LCA)
  • 原文地址:https://www.cnblogs.com/TFLSc1908lzs/p/13658564.html
Copyright © 2011-2022 走看看