1 问题描述

广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边的所有未访问顶点,以此类推,直到所有与初始顶点同在一个连通分量中的顶点都被访问过了为止。如果仍然存在未被访问的顶点,该算法必须从图的其他连接分量中的任意顶点重新开始。

2 解决方案

2.1 蛮力法


此处借用《算法设计与分析基础》(第3版)上一段文字介绍及其配图来讲解,下面程序中使用的图就是配图中所给的数据,在程序中,使用邻接矩阵来表示配图中图。

PS:下面所给程序的运行结果和配图中图(b)顺序在fb那两个位置不一致,下面程序运行结果顺序是acdebfghji,原因是在遍历的过程中,我所写代码是按照字母顺序来进行遍历的,书上所讲可能是使用链表来存储顶点,具体怎么实现本人也未去仔细探讨…

  1. package com.liuzhen.chapterThree;
  2. public class BreadthFirstSearch {
  3. public int count = 0; //计算广度优先遍历总次数,初始化为0
  4. /*
  5. * adjMatrix是待遍历图的邻接矩阵
  6. * value是待遍历图顶点用于是否被遍历的判断依据,0代表未遍历,非0代表已被遍历,其最终具体结果代表该顶点在最终遍历顺序中的位置
  7. * result用于存放广度优先遍历的顶点顺序
  8. */
  9. public void bfs(int[][] adjMatrix,int[] value,char[] result){
  10. for(int i = 0;i < value.length;i++){
  11. if(value[i] == 0){ //当该顶点未被遍历时
  12. char temp = (char) ('a' + i);
  13. result[count] = temp;
  14. System.out.println();
  15. System.out.println("出发点:"+temp+"地");
  16. bfsVisit(adjMatrix,value,result,i); //使用迭代遍历该顶点周边所有邻接顶点
  17. }
  18. }
  19. }
  20. /*
  21. * adjMatrix是待遍历图的邻接矩阵
  22. * value是待遍历图顶点用于是否被遍历的判断依据,0代表未遍历,非0代表已被遍历,其最终具体结果代表该顶点在最终遍历顺序中的位置
  23. * result用于存放广度优先遍历的顶点顺序
  24. * number是当前正在遍历的顶点在邻接矩阵中的数组下标编号
  25. */
  26. public void bfsVisit(int[][] adjMatrix,int[] value,char[] result,int number){
  27. value[number] = ++count; //出发顶点已被遍历,其在遍历结果中最终位置为++count
  28. for(int i = 0;i < value.length;i++){
  29. if(adjMatrix[number][i] == 1 && value[i] == 0){ //当改顶点与出发顶点相邻且未被遍历时
  30. char temp = (char) ('a' + i);
  31. result[count] = temp;
  32. System.out.print("到达"+temp+"地"+"\t");
  33. value[i] = ++count; //当前被遍历顶点,其在遍历结果中最终位置为++count
  34. }
  35. }
  36. }
  37. public static void main(String[] args){
  38. int[] value = new int[10]; //初始化后,各元素均为0
  39. char[] result = new char[10];
  40. char[] result1 = new char[10];
  41. int[][] adjMatrix = {{0,0,1,1,1,0,0,0,0,0},
  42. {0,0,0,0,1,1,0,0,0,0},
  43. {1,0,0,1,0,1,0,0,0,0},
  44. {1,0,1,0,0,0,0,0,0,0},
  45. {1,1,0,0,0,1,0,0,0,0},
  46. {0,1,1,0,1,0,0,0,0,0},
  47. {0,0,0,0,0,0,0,1,0,1},
  48. {0,0,0,0,0,0,1,0,1,0},
  49. {0,0,0,0,0,0,0,1,0,1},
  50. {0,0,0,0,0,0,1,0,1,0}};
  51. BreadthFirstSearch test = new BreadthFirstSearch();
  52. test.bfs(adjMatrix, value, result);
  53. System.out.println();
  54. System.out.println("判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历):");
  55. for(int i = 0;i < value.length;i++)
  56. System.out.print(" "+value[i]);
  57. //依据具体顶点在遍历结果顺序中最终位置,计算其具体遍历顺序为result1数组序列
  58. for(int i = 0;i < value.length;i++){
  59. result1[value[i]-1] = (char) ('a' + i);
  60. }
  61. System.out.println();
  62. System.out.println("判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历,其具体数字代表其原地点在被遍历结果中所处位置:):");
  63. for(int i = 0;i < value.length;i++)
  64. System.out.print(" "+result1[i]);
  65. System.out.println();
  66. System.out.println("广度优先查找遍历顺序如下:");
  67. for(int i = 0;i < result.length;i++)
  68. System.out.print(" "+result[i]);
  69. }
  70. }

运行结果:

  1. 出发点:a
  2. 到达c 到达d 到达e
  3. 出发点:b
  4. 到达f
  5. 出发点:g
  6. 到达h 到达j
  7. 出发点:i
  8. 判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历):
  9. 5 2 3 4 6 7 8 10 9
  10. 判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历,其具体数字代表其原地点在被遍历结果中所处位置:):
  11. a c d e b f g h j i
  12. 广度优先查找遍历顺序如下:
  13. a c d e b f g h j i

Java实现BFS广度优先查找的更多相关文章

  1. 算法笔记_021:广度优先查找(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边 ...

  2. 图的遍历BFS广度优先搜索

    图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...

  3. Java中常用的查找算法——顺序查找和二分查找

    Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...

  4. Java学习之二分查找算法

    好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...

  5. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  6. BFS广度优先搜索 poj1915

    Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...

  7. JS广度优先查找无向无权图两点间最短路径

    广度优先查找无向无权图两点间最短路径,可以将图看成是以起点为根节点的树状图,每一层是上一层的子节点,一层一层的查找,直到找到目标节点为止. 起点为0度,与之相邻的节点为1度,以此类推. // 广度优先 ...

  8. 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想

    dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...

  9. 算法竞赛——BFS广度优先搜索

    BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...

随机推荐

  1. Mysql 常用函数(10)- strcmp 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html strcmp 的作用 比较两个字符串的顺序是否完全 ...

  2. WEB程序报错Address localhost:1099 is already in use的解决方案(网络端口被占用导致程序无法运行)

    首先,这是说明你的本地端口1099已经被占用了,解决的方法有两个: 1.停止本地占用端口 打开cmd 按如下指令进行命令输入,就能找出占用端口的进程并停止啦 2.修改程序运行端口 一个问题,两种解决办 ...

  3. python爬虫-直播吧

    概述 这是一个我很喜欢的小网站,想了解这个网站先从爬虫开始,爬取直播吧所有的栏目及内容,再存入数据库.先写个简单点的,后期再不断的优化下. 准备阶段 直播吧网址https://www.zhibo8.c ...

  4. linux 修改时间同步到BIOS

    设置时间和日期例如:将系统日期设定成2020年4月14日的命令 命令 : "date -s 04/14/2020" 将系统时间设定成下午5点55分55秒的命令 命令 : " ...

  5. android 防止多次点击,导致事件监听响应到其他界面

    下面有个案例: A点击的时候就跳转到B界面,点击B界面后结束,返回到A界面中 1.此时在B界面中,设置点击事件,点击后结束B v.setOnClickListener(new OnClickListe ...

  6. SpringBoot + react app 项目,解决跨域问题的配置(跳坑含泪总结,亲测有效)

    方法一: 对某一接口配置,可以在方法上添加 @CrossOrigin 注解 @CrossOrigin(origins = {"http://localhost:8110", &qu ...

  7. Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 普通操作 1. 读取像素 读取像素可以通过行坐标和列坐标来进行访问,灰度图像直接返回灰度值,彩色图像则返回B.G.R三个分量. 需 ...

  8. docker 容器核心技术

    容器的数据卷(volume)也是占用磁盘空间,可以通过以下命令删除失效的volume: [root@localhost]# sudo docker volume rm $(docker volume ...

  9. CentOS 7.1 图形化安装

    1.在命令行下输入下面的命令来安装 Gnome 包 sudo  yum groupinstall "GNOME Desktop" "Graphical Administr ...

  10. Java—线程的生命周期及线程控制方法详解

    线程生命周期5种状态 介绍   线程的生命周期经过新建(New).就绪(Runnable).运行(Running).阻塞(Bolocked)和死亡(Dead) 状态转换图 新建(New)   程序使用 ...