`
shenyu
  • 浏览: 122947 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

图-广度优先遍历

阅读更多

这里的图的广度优先遍历算法利用了队来实现。

图的深度遍历原则:

1 如果有可能,访问所有领接的未访问的节点,标记它们,并把它们放入队中。

2 当不能执行规则 1 时,如果对不为空,则从队中弹出头元素。重新执行规则 1

3 如果不能执行规则 1 和规则 2 时,则完成了遍历。

代码中的图使用的是Graph 图-邻接矩阵法 来表示,其他的表示法请见:Graph 图-邻接表法

代码中的Queue为辅助结构,用来记载访问过的节点。队列的详细描述可以见:Queue 队LinkedQueue 队

Vertex表示图中的节点,其中包含访问,是否访问,清除访问标志的方法。

Graph.main:提供简单测试。代码可以以指定下标的节点开始作广度优先遍历。

代码比较简单,除了Graph.bsf(int i)广度优先遍历算法外没有过多注释。

class Queue {
	private int[] values;
	private int begin = -1;
	private int end = -1;
	Queue(int size) {
		values = new int[size];
	}
	void push(int value) { values[++begin] = value; }
	int pop() { return values[++end]; }
	boolean isEmpty() { return begin == end; }
}

class Vertex {
	private Object value;
	private boolean isVisited;
	Vertex(Object value) {
		this.value = value;
	}

	void visit() { isVisited = true; print(); }
	void clean() {	isVisited = false; }
	boolean isVisited() { return isVisited; }
	void print() { System.out.println(value); }
}

class Graph {
	private Vertex[] vertexs;
	private int[][] adjMat;
	private int pos = -1;

	Graph(int size) {
		vertexs = new Vertex[size];
		adjMat = new int[size][size];
	}

	void add(Object value) {
		assert pos < vertexs.length;
		vertexs[++pos] = new Vertex(value);
	}

	void connect(int from, int to) {
		adjMat[from][to] = 1;
		adjMat[to][from] = 1;
	}

	void disConnect(int from, int to) {
		adjMat[from][to] = 0;
		adjMat[to][from] = 0;
	}

	int findNeighbor(int index) {
		for(int i=0; i<=pos; i++) {
			if(adjMat[index][i] == 1 && !vertexs[i].isVisited()) return i;
		}
		return -1;
	}

	void bsf(int index) {	//从指定下标的节点开始深度优先遍历
		if(vertexs[index] == null) return;	//如果图中没有指定下标节点,则退出
		Queue q = new Queue(vertexs.length);	//创建队列存放访问过的节点
		vertexs[index].visit(); //访问指定节点
		q.push(index);	//将节点推入队列中
		while(!q.isEmpty()) {	//队列为空则表示遍历结束
			index = q.pop();	//取出队头
			int i; 
			while((i=findNeighbor(index)) != -1) {	//寻找头节点的所有邻接节点
				vertexs[i].visit();	//标记访问过的邻接节点
				q.push(i);	//放入队列中
			} 
		} 
	}

	void clean() { for(Vertex v: vertexs) if(v != null)v.clean(); }

	public static void main(String[] args) {
		Graph g = new Graph(20);
		g.add('a');
		g.add('b');
		g.add('c');
		g.add('d');
		g.add('e');
		g.connect(0,1);
		g.connect(1,2);
		g.connect(0,3);
		g.connect(3,4);
		g.bsf(0);
	}
}
 
7
5
分享到:
评论
2 楼 wenhui45 2009-11-13  
楼主,是否可以考虑下让队列成为循环队列,现在这个好像没有这个机制,
1 楼 walsh 2008-12-02  
第一次看到楼主的算法这么全,辛苦了,谢谢楼主!!!

相关推荐

    图的深度优先遍历和广度优先遍历算法

    "图的深度优先遍历和广度优先遍历算法" 图的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握图这一数据结构的基础。通过此程序算法可以进一步掌握图的构造以及遍历的相关知识。 图的深度优先遍历算法 ...

    迷宫问题-广度优先遍历

    广度优先遍历是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着树的宽度优先遍历所有节点。在迷宫问题中,我们把迷宫视为一个图,每个可通行的格子看作一个节点,相邻的格子之间有边相连。以下是利用BFS解决...

    无向图建立、深度优先遍历和广度优先遍历实现算法[借鉴].pdf

    无向图建立、深度优先遍历和广度优先遍历实现算法 本文将详细介绍无向图的建立、深度优先遍历和广度优先遍历的实现算法。这些算法是数据结构中非常重要的内容,掌握它们对后续学习和应用非常重要。 一、无向图的...

    图的创立数据结构对其进行深度优先遍历和广度优先遍历

    在本文中,我们将深入探讨图的数据结构以及如何对图进行深度优先遍历(DFS)和广度优先遍历(BFS)。首先,我们要理解图的基本概念。图是一种数据结构,用于表示对象之间的关系,其中的对象称为顶点或节点,而它们...

    邻接表表示的图的广度优先遍历

    《数据结构与算法(C++版)》先关 邻接表表示的图的广度优先遍历的动画演示

    三壶谜题-广度优先遍历算法-python实现

    三壶谜题,广度优先遍历算法,python实现。 三壶谜题是一个经典的算法问题,通常使用广度优先遍历(BFS)算法来解决。以下是对三壶谜题及其广度优先遍历算法的详细介绍: 1. 基本概述 - 定义:三壶谜题是一个涉及...

    图的深度优先遍历与广度优先遍历(C语言实现)

    本篇文章将深入探讨两种主要的图遍历算法:深度优先遍历(DFS,Depth-First Search)和广度优先遍历(BFS,Breadth-First Search),并提供C语言的实现。 **深度优先遍历(DFS)** 深度优先遍历是一种递归的策略,...

    建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc

    "建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历" 本文档主要介绍了图的存储方式,包括邻接矩阵和邻接表两种存储方法,并在此基础上实现了图的深度优先遍历和广度优先遍历。 一、图...

    图的深度、广度优先遍历(c语言)

    ### 图的深度、广度优先遍历(C语言) #### 概述 本文将详细介绍如何在C语言中实现图的深度优先遍历(DFS)和广度优先遍历(BFS)。这两种遍历方法是图论中最基本且重要的算法之一,在解决实际问题时有着广泛的...

    图的深度优先和广度优先遍历

    图的广度优先遍历是指从某个节点开始,逐层遍历图的每个节点。我们可以使用 travel_width 函数来实现图的广度优先遍历。该函数使用队列来存储节点,并使用 while 循环来遍历图的每个节点。在遍历过程中,该函数会...

    邻接表或者邻接矩阵为存储结构实现连通无向图的深度优先和广度优先遍历

    在这个程序设计任务中,我们需要实现的是连通无向图的深度优先遍历(DFS)和广度优先遍历(BFS),这两种遍历方法是图算法的基础。无向图指的是图中的边没有方向,即任意两个节点之间可以双向连接。 1. **邻接表和...

    图的存储与深度优先与广度优先遍历

    ### 图的存储与深度优先与广度优先遍历 #### C++实现的图的存储结构 在本篇文章中,我们将探讨图数据结构的存储方法及其两种主要的遍历算法:深度优先搜索(DFS)和广度优先搜索(BFS)。图是一种非线性的数据结构...

    深度优先和广度优先遍历图算法

    本源文件CPP中代码使用深度优先和广度优先遍历图的算法。

    图的深度与广度优先遍历源程序

    实现图的深度与广度优先遍历 c++6.0运行

    图的深度优先遍历和广度优先遍历

    ### 图的深度优先遍历与广度优先遍历 在计算机科学中,图是一种非常重要的数据结构,用于模拟各种现实世界中的关系网络。对于图的处理,遍历是其中最基础也是最重要的一种操作。本文将重点介绍两种常用的图遍历算法...

    图的广度优先遍历

    本实验实现邻接表表示下无向图的广度优先遍历。程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志)。程序的输出为图的邻接表和广度优先遍历序列。 程序输入为: a b c d e f ...

    图的遍历,包括深度优先和广度优先遍历

    在这个主题下,我们将深入探讨深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search),以及在树结构中常见的先序、中序和后序遍历。这些遍历方法各有其特点,适用于不同的问题场景。...

    Java实现图的深度优先遍历和广度优先遍历

    根据遍历方式的不同,图的遍历可以分为深度优先遍历(DFS)和广度优先遍历(BFS)。本文将深入探讨这两种遍历方法,并提供其在Java中的实现。 ### 图的深度优先遍历(DFS) 深度优先遍历是一种递归地访问图中的...

Global site tag (gtag.js) - Google Analytics