Java实现BFS广度优先查找
1 问题描述
广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边的所有未访问顶点,以此类推,直到所有与初始顶点同在一个连通分量中的顶点都被访问过了为止。如果仍然存在未被访问的顶点,该算法必须从图的其他连接分量中的任意顶点重新开始。
2 解决方案
2.1 蛮力法
此处借用《算法设计与分析基础》(第3版)上一段文字介绍及其配图来讲解,下面程序中使用的图就是配图中所给的数据,在程序中,使用邻接矩阵来表示配图中图。
PS:下面所给程序的运行结果和配图中图(b)顺序在fb那两个位置不一致,下面程序运行结果顺序是acdebfghji,原因是在遍历的过程中,我所写代码是按照字母顺序来进行遍历的,书上所讲可能是使用链表来存储顶点,具体怎么实现本人也未去仔细探讨…
package com.liuzhen.chapterThree;
public class BreadthFirstSearch {
public int count = 0; //计算广度优先遍历总次数,初始化为0
/*
* adjMatrix是待遍历图的邻接矩阵
* value是待遍历图顶点用于是否被遍历的判断依据,0代表未遍历,非0代表已被遍历,其最终具体结果代表该顶点在最终遍历顺序中的位置
* result用于存放广度优先遍历的顶点顺序
*/
public void bfs(int[][] adjMatrix,int[] value,char[] result){
for(int i = 0;i < value.length;i++){
if(value[i] == 0){ //当该顶点未被遍历时
char temp = (char) ('a' + i);
result[count] = temp;
System.out.println();
System.out.println("出发点:"+temp+"地");
bfsVisit(adjMatrix,value,result,i); //使用迭代遍历该顶点周边所有邻接顶点
}
}
}
/*
* adjMatrix是待遍历图的邻接矩阵
* value是待遍历图顶点用于是否被遍历的判断依据,0代表未遍历,非0代表已被遍历,其最终具体结果代表该顶点在最终遍历顺序中的位置
* result用于存放广度优先遍历的顶点顺序
* number是当前正在遍历的顶点在邻接矩阵中的数组下标编号
*/
public void bfsVisit(int[][] adjMatrix,int[] value,char[] result,int number){
value[number] = ++count; //出发顶点已被遍历,其在遍历结果中最终位置为++count
for(int i = 0;i < value.length;i++){
if(adjMatrix[number][i] == 1 && value[i] == 0){ //当改顶点与出发顶点相邻且未被遍历时
char temp = (char) ('a' + i);
result[count] = temp;
System.out.print("到达"+temp+"地"+"\t");
value[i] = ++count; //当前被遍历顶点,其在遍历结果中最终位置为++count
}
}
}
public static void main(String[] args){
int[] value = new int[10]; //初始化后,各元素均为0
char[] result = new char[10];
char[] result1 = new char[10];
int[][] adjMatrix = {{0,0,1,1,1,0,0,0,0,0},
{0,0,0,0,1,1,0,0,0,0},
{1,0,0,1,0,1,0,0,0,0},
{1,0,1,0,0,0,0,0,0,0},
{1,1,0,0,0,1,0,0,0,0},
{0,1,1,0,1,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,1},
{0,0,0,0,0,0,1,0,1,0},
{0,0,0,0,0,0,0,1,0,1},
{0,0,0,0,0,0,1,0,1,0}};
BreadthFirstSearch test = new BreadthFirstSearch();
test.bfs(adjMatrix, value, result);
System.out.println();
System.out.println("判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历):");
for(int i = 0;i < value.length;i++)
System.out.print(" "+value[i]);
//依据具体顶点在遍历结果顺序中最终位置,计算其具体遍历顺序为result1数组序列
for(int i = 0;i < value.length;i++){
result1[value[i]-1] = (char) ('a' + i);
}
System.out.println();
System.out.println("判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历,其具体数字代表其原地点在被遍历结果中所处位置:):");
for(int i = 0;i < value.length;i++)
System.out.print(" "+result1[i]);
System.out.println();
System.out.println("广度优先查找遍历顺序如下:");
for(int i = 0;i < result.length;i++)
System.out.print(" "+result[i]);
}
}
运行结果:
出发点:a地
到达c地 到达d地 到达e地
出发点:b地
到达f地
出发点:g地
到达h地 到达j地
出发点:i地
判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历):
5 2 3 4 6 7 8 10 9
判断节点是否被遍历结果(0代表未遍历,非0代表已被遍历,其具体数字代表其原地点在被遍历结果中所处位置:):
a c d e b f g h j i
广度优先查找遍历顺序如下:
a c d e b f g h j i
Java实现BFS广度优先查找的更多相关文章
- 算法笔记_021:广度优先查找(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 广度优先查找(Breadth-first Search,BFS)按照一种同心圆的方式,首先访问所有和初始顶点邻接的顶点,然后是离它两条边 ...
- 图的遍历BFS广度优先搜索
图的遍历BFS广度优先搜索 1. 简介 BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点"死磕到底"的思维不同,广度优先 ...
- Java中常用的查找算法——顺序查找和二分查找
Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...
- Java学习之二分查找算法
好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己 ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- BFS广度优先搜索 poj1915
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...
- JS广度优先查找无向无权图两点间最短路径
广度优先查找无向无权图两点间最短路径,可以将图看成是以起点为根节点的树状图,每一层是上一层的子节点,一层一层的查找,直到找到目标节点为止. 起点为0度,与之相邻的节点为1度,以此类推. // 广度优先 ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
随机推荐
- linux --vim 补充 .vimrc
1.今天发现了一个新的功能.vimrc 1.这个是一个个人配置文件,可以在这个里面首先对vim进行一些设置呢 如果系统没有.vimrc文件,可以自己创建一个,touch .vimrc 举个栗子,我在. ...
- struts2 进阶--异常捕获机制
在SpringMvc中有自己的异常处理机制,struts2当然会有此功能,主要是在struts.xml中配置: <bean type="com.opensymphony.xwork2. ...
- Abp领域事件(EventBus)源码解析
Abp中使用EventBus来解耦领域中的业务逻辑,也是订阅-发布模式的一种实现.简单来说就是,当我触发一个事件,注册了这个事件的处理器就会被找到并执行. 先看看整体代码结构 其中Entities文件 ...
- OpenCv 学习安装(一)
1.opencv版本:opencv-3.4.2-vc14_vc15.exe2.设置环境变量path: E:\opencv\opencv\build\x64\vc14\bin3.用VS2015新建一个w ...
- Nginx服务器的安装和卸载
Nginx的安装 安装Nginx之前,需要先获取Nginx的安装文件.我们可以在http://nginx.org/en/download.html获取各个版本的Nginx安装文件.大家可以按照自己的需 ...
- nginx均衡负载
一直在担心session 问题,结果试了2个web 论坛,discuz 和phpbb ,前面用nginx 均衡负载,后端是apache httpd +php ,mysql 用同一个,修改一下confi ...
- 【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...
- lonic常用组件之五------按钮
一.Ionic常用组件之五------按钮 <ion-button color="主题色" size="small/large" expand=& ...
- ES6常见面试题
1.es5和es6的区别,说一下你所知道的es6 ECMAScript5,即ES5,是ECMAScript的第五次修订,于2009年完成标准化 ECMAScript6,即ES6,是ECMAScript ...
- mvc 页面上循环datatable
@using System.Data; @{ Layout = null; } @{ DataTable DataServiceStaff = ViewBag.ServiceStaff as Data ...