• ACM__搜素之BFS与DFS


    BFS(Breadth_First_Search)

    DFS(Depth_First_Search)

    拿图来说

    BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4,2与3也相连,然而3已经被找到了,跳过;搜3,3与5相连,找到了5;搜4,4与5相连,5已经被找到了,跳过,4与6相连,找到了6;5,6没有连其他点,结束;

    DFS过程:以1为根节点,1与2,3相连;搜2,2与3,4相连;搜3,3与5相连;搜5,5没有与其他边相连,返回到3,3没有与其他边相连,返回到2;2还与4相连;搜4,4与5,6相连,5已经被找到了;搜6,6没有与其他点相连,返回到4,4已经搜完了,返回到2,2已经被搜完了,返回到1;1还与3相连,3已经被搜过了,结束!

    BFS是一层一层的搜,DFS是一直搜到底,直到不能搜为止,再一层一层的递归

    存图方式:

    1:可以用二维数组来存,当需要存的数据太大的话,就不能用了,不过有些题也是可以用的

    int edge[105][105];
    cin<<a<<b;
    edge[a][b]=1;

    2:可以用邻接链表来写,一般用vector

    vector<int>edge[100];
    cin<<a<<b;
    edge[a].push_back(b);

    3:  链式前向星(等复习到这的时候再来补充吧)

    具体过程代码

    BFS

     1 #include<queue>
     2 #include<vector>
     3 #include<cstdio>
     4 using namespace std;
     5 bool vis[105]
     6 void BFS()
     7 {
     8 queue<int>q;
     9 memset(vis,0,sizeof(vis));//先将所有节点初始化,还没有访问过
    10 vis[root]=1;//找一个根节点,标记为1
    11 q.push(a);//把该元素压入队列
    12 while(!q.empty())
    13 {
    14 u=q.front();//取队列的首元素
    15 q.pop();//首元素出队
    16 for(int i=0;i<edge[u].size();i++)
    17 {
    18 if(vis[edge[u][i]]==0)//如果该点没有被访问过
    19 {
    20 vis[edge[u][i]]=1;//表示该点已经访问过
    21 q.push(edge[u][i]);//入队
    22 }
    23 }
    24 }
    25 }
    26 int main()
    27 {
    28 vector<int>edge[100];
    29 cin<<a<<b;
    30 edge[a].push_back(b);//输入所有边
    31 BFS();//进行搜索
    32 }

    感觉像是,先找到根节点,入队,出队,再让与之相连的点入队,再是出队,让与之相连的点出队,重复这个过程,直到队列为空

    DFS

    DFS用递归实现

     1 vis[100];
     2 void DFS(int u)
     3 {
     4     vis[i]=1;
     5     for(int i=0;i<edge[u].size();i++)
     6     {
     7         if(vis[edge[u][i]]==0)
     8         {
     9             
    10             DFS(edge[u][i]);
    11         }
    12     }
    13 }
    14 int main()
    15 {
    16     memset(vis,0,sizeof(vis));
    17 }
  • 相关阅读:
    java的多线程学习,第二记
    java多线程的学习
    长城
    2018-12-6
    mysql的笔记
    springboot用jpa生成表,没有外键
    idea 使用方法
    Oracle数据库中文乱码问题
    JAVA-Could not create the Java virtual machine java启动失败
    log4j日志如何在ssh中配置?
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/9677594.html
Copyright © 2020-2023  润新知