这里的图的广度优先遍历算法利用了队来实现。
图的深度遍历原则:
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);
}
}
分享到:
相关推荐
迷宫问题-广度优先遍历 迷宫 代码 算法
图的广度优先遍历.doc 图的广度优先遍历.doc
无向图的连接表存储结构的创建算法 从编号为v的顶点出发,深度优先遍历图的算法 对具有G.vexnum个顶点的图的深度优先遍历的...从图G的v顶点出发,广度优先遍历图的算法 对具有G.vexnum个顶点的图的广度优先遍历的算法
《数据结构与算法(C++版)》先关 邻接表表示的图的广度优先遍历的动画演示
图的深度遍历和广度遍历是两个重要的算法,这也是我们理解并掌握图这一数据结构的基础。通过此程序算法可以进一步掌握图的构造以及遍历的相关知识。
数据结构中的图结构,其中最重要的两个遍历算法——深度优先遍历与广度优先遍历
无向图建立、深度优先遍历和广度优先遍历实现算法[借鉴].pdf
邻接矩阵存储图的深度优先遍历 邻接矩阵表示图_深度_广度优先遍历
深度优先遍历和广度优先遍历 建立图的应用等等
本源文件CPP中代码使用深度优先和广度优先遍历图的算法。
程序设计任务: 设计一个程序,实现以邻接表或者邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。基本要求:以邻接表或者邻接矩阵为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的...
实现图的深度与广度优先遍历 c++6.0运行
图的深度优先遍历和广度优先遍历-Java实现
本程序方便的实现了图的深度、广度优先遍历。是数据结构中的一部分,现与大家分享
本实验实现邻接表表示下无向图的广度优先遍历。程序的输入是图的顶点序列和边序列(顶点序列以*为结束标志,边序列以-1,-1为结束标志)。程序的输出为图的邻接表和广度优先遍历序列。 程序输入为: a b c d e f ...
该程序是我写的博客“一起talk C栗子吧(第四十六回:C语言实例--广度优先遍历)”的配套程序,共享给大家使用
建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc
图的遍历,非常经典啊,包括深度优先和广度优先遍历以及先序、中序、和后序等等,只有你想不到,没有我做不到的,希望对你有所帮助。