图的深度优先和广度优先——java

借鉴:https://www.cnblogs.com/lanjianqing/p/4125134.html
理解是自己的,供大家学习。

测试数据

在这里插入图片描述

char[] vertex={'A','B','C','D','E','F','G','H','I'};
        int[][] edges = {
                { 0, 1, 0, 0, 0, 1, 1, 0, 0 }, { 1, 0, 1, 0, 0, 0, 1, 0, 1 }, { 0, 1, 0, 1, 0, 0, 0, 0, 1 },
                { 0, 0, 1, 0, 1, 0, 1, 1, 1 }, { 0, 0, 0, 1, 0, 1, 0, 1, 0 }, { 1, 0, 0, 0, 1, 0, 1, 0, 0 },
                { 0, 1, 0, 1, 0, 1, 0, 1, 0 }, { 0, 0, 0, 1, 1, 0, 1, 0, 0 }, { 0, 1, 1, 1, 0, 0, 0, 0, 0 }
        };
        Graph graph = new Graph(vertex, edges);
        graph.DFS();

广度优先


    //广度优先
    public void BFS(){
        Queue<Integer> queue=new LinkedList<>();
        for(int i=0;i<vertexs.length;i++){
            if(flag[i]==false){
                flag[i]=true;//遍历到A
                System.out.println(vertexs[i]+" ");
                queue.add(i);//把A加入队列
                while (!queue.isEmpty()){
                    Integer j = queue.poll();//和j相连的
                    for(int k=0;k<vertexs.length;k++){
                        if(edges[j][k]==1&&flag[k]==false){//和j相连同时没有被访问过 BEG
                            flag[k]=true;
                            System.out.print(vertexs[k]+" ");
                            queue.add(k);
                        }
                    }
                    System.out.println();
                }
            }
        }
    }

理解
在这里插入图片描述
先遍历A,把A加入队列
然后遍历所有和A相连的节点并且该节点并没有被访问过,遍历过后把这些节点加入队列
此时与A连的已经变量完了,相当于第一梯队已经遍历完了,要遍历第二梯队,即BFG的下一个且仅一个
后续过程都如此,每次仅遍历一层,一层一层往下
由于存放节点的是队列先进先出,所有有顺序
在这里插入图片描述
结果:
在这里插入图片描述

深度优先

    public void DFS(){
        for(int i=0;i<vertexs.length;i++){
            if(flag[i]==false){
                forDFS(i);
            }
        }
    }

    public void forDFS(int i){
        flag[i]=true;
        System.out.print(vertexs[i]+" ==");
        for(int j=0;j<vertexs.length;j++){
            if(flag[j]==false&&edges[i][j]==1){
                forDFS(j);
            }
        }
    }

理解
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值