算法起步之广度优先搜索

原文:算法起步之广度优先搜索

          广度优先搜索算法是图的基本算法之一,图是用来保存过对多的关系的数据结构,相对于树一对多的关系更为复杂,所以难度也会比树结构难一点,图的存储一般有连接表表示跟链接矩阵表示,相比来说链接矩阵的方式更为常用,也就是用数组来存储。而广度优先搜索算法其实就是图的遍历过程,数组的遍历大家都会,数组的遍历我们是按照下标的顺序来遍历的,而图的遍历也有自己的方式,图是多对多的关系,我们可以按照各个节点直接的关联关系来遍历他们,这样便衍生出来深度优先跟广度优先,广度优先是先访问与跟当前节点相关联的所有节点,而深度优先则是按照关联关系一层层的遍历。如下图:

          广度优先搜索我们需要借助一个队列,我们可以自己写一个队列,也可以借助linkedlist。

public class BFS {
	private LinkedList list=new LinkedList();

	public void BFS(int[][] map){
		 boolean[] visited=new boolean[map.length];
		 for (int i = 0; i < visited.length; i++) {
			if (!visited[i]) {
				list.addLast(i);
				while (!list.isEmpty()) {
					//访问队列里面的第一个节点
					int now=(Integer) list.removeFirst();
					visited[now]=true;
					// 将与该节点关联的且没有访问的节点加入到队列中。
					for (int j = 0; j < visited.length; j++) {
						if (map[now][j]==1&&!visited[j]) {
								list.addLast(j);
						}
					}
				}
			}
		}
	}
}

友情提示:转载请注明出处【作者:idlear  博客:http://blog.csdn.net/idlear

时间: 2024-10-11 10:12:20

算法起步之广度优先搜索的相关文章

算法起步之深度优先搜索

原文:算法起步之深度优先搜索        说完广度优先搜索后,我们来看图的另一种遍历形式,深度优先搜索算法,深度优先总是对刚发现的节点的出阿发边进行探索,直到该节点的所有出发边都被发现为止.一旦所有的出发边都被发现,搜索就回溯到前驱结点,来搜索前驱结点的出发边.反复进行直到全部遍历.我们用递归跟栈两种方式进行实现,其实归根到底递归也是栈实现的.        递归实现:   public class DFS { private boolean[] visited; public void df

C++实现广度优先搜索实例_C 语言

本文主要叙述了图的遍历算法中的广度优先搜索(Breadth-First-Search)算法,是非常经典的算法,可供C++程序员参考借鉴之用.具体如下: 首先,图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次.注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历.图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search). 一.广度优先搜索(BFS)的

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之:反之,退回到最近访问过的顶点:直到与起始顶点相通的全部顶点都访问完毕: 3.若此时图中尚有顶点未被访问,则再选其中一个顶点作为起始顶点并访问之,转 2: 反之,遍历结束.  连通图的深度优先遍历类似于树的先根遍历 如何判别V的邻接点是否被访问? 解决办法:为每个顶点设立一个"访问标志

【算法导论】图的广度优先搜索遍历(BFS)

       图的存储方法:邻接矩阵.邻接表        例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表:         邻接表存储方法是一种顺序存储与链式存储相结合的存储方法.在这种方法中,只考虑非零元素,所以在图中的顶点很多而边很少时,可以节省存储空间.         邻接表存储结构由两部分组成:对于每个顶点vi, 使用一个具有两个域的结构体数组来存储,这个数组称为顶

人工智能: 自动寻路算法实现(一、广度优先搜索)

前言 随着人工智能技术的日益发达,我们的生活中也出现了越来越多的智能产品.我们今天要关注的是智能家居中的一员:扫地机器人.智能扫地机器人可以在主人不在家的情况下自动检测到地面上的灰尘,并且进行清扫.有些更为对路线进行规划,找到可以清理灰尘的最短路径,达到省电的效果.当然,绕过障碍物也是必须拥有的技能.我们今天就来看一下扫地机器人自动寻路的算法的简单实现.这里我们不对机器人如何识别出灰尘进行讨论,我们只讨论发现了灰尘之后,机器人的路径规划进行一个分析.为了简单起见,我们假设机器人所处在的是一个M×

【算法小总结】广度优先搜索剖析

广度优先搜索 以前一直用搜索用的都是深搜,因为听说有很多题能用广搜就能用深搜什么的.今天老老实实的去看广搜了,结果发现我之前想的太天真的,DFS和BFS不仅在性质上不同,而且对于某些题和某些情况,用BFS比DFS要快(不是绝对).   今天好好说道说道这个BFS(广度优先搜索)   很多问题(如过迷宫问题),每走下一步,都要考虑很多种情况,这个时候,就要每一步每一步的去试探,去找到合适的方案,也是就是传说中的"搜索".   当然,想试探出结果,可以去将一种方案走到底,遇到不能走或者其他

如何使用堆栈在树上执行广度优先搜索(逐级搜索)

简介 本文介绍了如何使用堆栈在树上执行广度优先搜索(逐级搜索),可以使用过程分配的堆栈或者使用一个独立的堆栈数据结构.BFS 是一种优先考虑广度的树扫描方式.打印的第一个节点是根节点,随后是它的直系子节点,然后是下一级子节点.在这里,根节点位于第 1 级,它的子节点位于第 2 级.接下来打印第 3 级上的孙节点.BFS 将继续以这种方式打印,直到到达最后一级.下面的树就是一个例子. (a) | v --------------------------------------------- | |

算法起步之并查集(不相交集合数据结构)

原文:算法起步之并查集(不相交集合数据结构)          在java中经典的数据结构基本都给实现好了,我们可以直接调用,但是并查集这种数据结构却没有很好的替代工具,在这里我们我们自己去实现并查集数据结构.首先我们先要去了解什么是并查集.并查集也是一种非常经典常用的数据结构.像求连通子图跟我们下面要研究的最小生成树问题都会用到并查集.并查集就是能够实现若干个不相交集合,较快的合并和判断元素所在集合的操作.不相交集合:一个不相交集合维护了一个不相交动态集合{s1,s2,s3--}我们用一个代表

算法起步之二叉搜索树

原文:算法起步之二叉搜索树         学习二叉搜索树之前,我们先复习一下树的相关知识,数是几种经典的数据结构之一,树其实就是维护了一对多的关系,一个节点可以有多个孩子,但是每个节点至多只有一个双亲.如何去描述存储一棵树呢,这里方法有很多,数组.链表.十字链表等等.这里我们主要研究二叉树,二叉树是树的一种特殊形式,节点至多只有两棵子树,有左右之分次序不能任意颠倒.二叉树还有一个性质就是叶子节点的个数=度为2的节点+1 .二叉搜索树又叫二叉排序树或二叉查找树.他比二叉树又加个1个性质,就是左子