图的搜索算法:BFS和DFS详解(Java实现)

本文转载自:https://blog.csdn.net/z69183787/article/details/91338143
在这里插入图片描述

图的搜索算法:BFS和DFS详解(Java实现)


上一篇我们介绍了图的基本概念以及图的存储方式:邻接矩阵和邻接表;接下来我们将介绍一下有关图的基本的遍历算法,BFS(广度优先搜索遍历 )和DFS(深度优先搜索遍历 )这两种遍历方式。
这里我们就以无向图来做示例:

无向图G1

 

DFS(深度优先遍历)

深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而C节点又是A的一个邻近节点,则DFS访问A节点后再访问C节点,如果C节点有未访问的邻近节点的话将继续访问其邻近节点,否则继续访问A的未访问邻近节点,当所有从A节点出去的路径都访问完之后,继续递归访问除A以外未被访问的邻近节点。
所以上面我们的示意图的遍历顺序会是A->C->B->D->E->F。

BFS(广度优先遍历)

其主要思想是从起始点开始,将其邻近的所有顶点都加到一个队列(FIFO)中去,然后标记下这些顶点离起始顶点的距离为1.最后将起始顶点标记为已访问,今后就不会再访问。然后再从队列中取出最先进队的顶点A,也取出其周边邻近节点,加入队列末尾,将这些顶点的距离相对A再加1,最后离开这个顶点A。依次下去,直到队列为空为止。从上面描述的过程我们知道每个顶点被访问的次数最多一次(已访问的节点不会再访问),而对于连通图来说,每个顶点都会被访问。加上每个顶点的邻接链表都会被遍历,因此BFS的时间复杂度是Θ(V+E),其中V是顶点个数,E是边数,也就是所有邻接表中的元素个数。
所以我们上图的遍历顺序将会为:A->C->D->B->E->F

实现代码如下:


 
 
  1. public class Graph { //A, B, C,D, E, F
  2. static int[][] graph = new int[][]{{ 0, 0, 1, 1, 0, 0},
  3. { 0, 0, 1, 0, 0, 0},
  4. { 1, 1, 0, 0, 0, 0},
  5. { 0, 0, 1, 0, 1, 0},
  6. { 0, 0, 0, 1, 0, 1},
  7. { 0, 0, 0, 0, 1, 0}};
  8. int[] help = new int[graph.length]; //用来记录已经遍历过的元素
  9. //DFS(深度优先遍历)同样适用于有向图 A->C->B->D->E->F 即 0->2->1->3->4->5
  10. public void dfsTraversing(int node, int[][] graph) {
  11. help[node]= 1;
  12. System.out.println(node);
  13. for ( int i = 0; i < graph[node].length; ++i) {
  14. if (help[i]== 0&&i != node&&graph[node][i]== 1) {
  15. dfsTraversing(i, graph);
  16. }
  17. }
  18. }
  19. //BFS(广度优先遍历)同样适用于有向图 A->C->D->B->E->F 即0->2->3->1->4->5
  20. public void bfsTraversing(int[][] graph) {
  21. int[] queue= new int[graph.length];
  22. int cnt= 1;
  23. queue[ 0]= 0; //将A作为起始顶点加入队列
  24. help[ 0]= 1;
  25. System.out.println( 0);
  26. for ( int i= 0;i<cnt;++i){
  27. for ( int j= 0;j<graph[ queue[i]].length;++j){
  28. if ( queue[i]!=j&&graph[ queue[i]][j]== 1&&help[j]== 0){
  29. help[ queue[i]]= 1;
  30. queue[cnt++]=j;
  31. System.out.println(j);
  32. }
  33. }
  34. }
  35. }
  36. }

 

  •                     <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count"></span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/z69183787">
                    <img src="https://profile.csdnimg.cn/0/6/0/3_z69183787" class="avatar_pic" username="z69183787">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/1x/11.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/z69183787" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">OkidoGreen</a></span>
                                            </div>
                    <div class="text"><span>发布了308 篇原创文章</span> · <span>获赞 1855</span> · <span>访问量 1425万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://bbs.csdn.net/topics/395526317" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值