zoukankan      html  css  js  c++  java
  • DFS & BFS

    DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种。是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点 。

    介绍如下:http://baike.baidu.com/link?url=-Qr8pxnyPEe03J07nhRELWcTFjhY4CDPwNn-dpRdDAfMX9_yYFiYj-382urgVFO9A39GdG7NsUt2gIOq6byWoNzjT-KP5gPjH8If3WqpbtC

    一般用于图的遍历和树的遍历

    可以参考这篇文章:http://blog.csdn.net/lulipeng_cpp/article/details/7524133

    实现如下:

     1 #include <iostream>
     2 #include <vector>
     3 #include <queue>
     4 using namespace std;
     5 
     6 vector<pair<int,int> > eg[100];
     7 
     8 typedef pair<int,int> pa;
     9 
    10 bool visit[100];
    11 
    12 void dfs_graph(int n,int d)
    13 {
    14           void dfs(int v);
    15 
    16           for(int i = 0;i<n;i++)
    17                     visit[i] = false;
    18 
    19           for(int i = 0;i<n;i++)//遍历每个顶点是为了防止图不连通时无法访问每个顶点 
    20           {
    21                     if(visit[i]==false)
    22                               dfs(i);
    23           }
    24 }
    25 
    26 void dfs(int v)
    27 {
    28           visit[v] = true;
    29           cout<<v<<" -> ";
    30           for(int i = 0;i<eg[v].size();i++)//遍历v的所有邻接点
    31           {
    32                     pa x = eg[v][i];
    33                     if(visit[x.first]==false)
    34                     {
    35                               dfs(x.first);//递归
    36                     }
    37           }
    38 }
    39 
    40 
    41 int main()
    42 {
    43           int n,d;
    44           cin>>n>>d;
    45           for(int i = 0;i<d;i++)
    46           {
    47                     int t,s,w;
    48                     cin>>t>>s>>w;
    49                     eg[t].push_back(make_pair(s,w));
    50           }
    51           dfs_graph(n,d);
    52 
    53 
    54 
    55 }
    56 /*
    57 6 8
    58 0 1 2
    59 0 3 4
    60 1 4 4
    61 2 0 5
    62 2 5 2
    63 3 4 3
    64 3 5 7
    65 5 4 3
    66 */

    BFS:

    宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

    介绍如下:

    http://baike.baidu.com/view/288267.htm?fromtitle=BFS&fromid=542084&type=syn

    思路是先逐个访问某点的所有邻接点,同时用队列将邻接点压入,然后访问队列头元素,直至队列为空

    实现如下:

     1 #include <iostream>
     2 #include <vector>
     3 #include <queue>
     4 using namespace std;
     5 
     6 vector<pair<int,int> > eg[100];
     7 
     8 typedef pair<int,int> pa;
     9 
    10 bool visit[100];
    11 
    12 void bfs_graph(int n,int d)
    13 {
    14           void bfs(int v);
    15 
    16           for(int i = 0;i<n;i++)
    17                     visit[i] = false;
    18 
    19           for(int i = 0;i<n;i++)//遍历每个顶点是为了防止图不连通时无法访问每个顶点
    20           {
    21                     if(visit[i]==false)
    22                               bfs(i);
    23           }
    24 }
    25 
    26 void bfs(int v)
    27 {
    28           visit[v] = true;
    29           cout<<v<<" -> ";
    30 
    31           queue<int> q;
    32           q.push(v);
    33           while(!q.empty())
    34           {
    35                     int s = q.front();
    36                     q.pop();
    37                     for(int i = 0;i<eg[s].size();i++)//遍历v的所有邻接点
    38                     {
    39                               pa x = eg[s][i];
    40                               if(visit[x.first]==false)
    41                               {
    42                                         visit[x.first] = true;
    43                                         q.push(x.first);
    44                                         cout<<x.first<<" -> ";
    45 
    46                               }
    47                     }
    48           }
    49 }
    50 
    51 
    52 int main()
    53 {
    54           int n,d;
    55           cin>>n>>d;
    56           for(int i = 0;i<d;i++)
    57           {
    58                     int t,s,w;
    59                     cin>>t>>s>>w;
    60                     eg[t].push_back(make_pair(s,w));
    61           }
    62           bfs_graph(n,d);
    63 
    64 
    65 
    66 }
    67 /*
    68 6 8
    69 0 1 2
    70 0 3 4
    71 1 4 4
    72 2 0 5
    73 2 5 2
    74 3 4 3
    75 3 5 7
    76 5 4 3
    77 */
  • 相关阅读:
    秦曾昌人工智能课程---6、Decision Tree Learning
    秦曾昌人工智能课程---5、KNN和朴素贝叶斯
    秦曾昌人工智能课程---4、梯度下降算法
    我和最小二乘法的二三事
    英语影视台词---The Professor
    秦曾昌人工智能课程---3、机器学习中的哲学
    python从入门到大神---1、初始化实例、类属性、方法
    秒懂神经网络---震惊!!!神经网络原来可以这么简单!
    秦曾昌人工智能课程---2、机器学习中的数学基础2
    linuxc_螺纹锁紧pthread_mutex_t
  • 原文地址:https://www.cnblogs.com/qlky/p/4985978.html
Copyright © 2011-2022 走看看