数据结构Java版之广度优先图(十三)
广度优先,则是用的队列,将每一层的节点先存入队列中去,后依次取出队列中的节点,显示与当前节点存在边,但是未被访问过的节点,也就是下一层与之相联系的节点,再将这些节点存入队列。经过层层迭代,就可以完全遍历
整个图。
源码:
package mygraph; import java.util.LinkedList;
import java.util.Queue; public class BFS_Vertex {
class Vertex {
private char lable;
private int val;
private boolean wasvisited;
Vertex(char lable) {
this.lable = lable;
}
Vertex() { }
}
private char lable; // 矩阵元素
private Vertex[][] list = new Vertex[20][20];
private Vertex[] vertexList = new Vertex[20];
private int nVerts; // 当前顶点下标
BFS_Vertex() {
this.nVerts = 0;
for(int i = 0; i < 20; i ++) {
for(int j = 0; j < 20; j ++) {
list[i][j] = new Vertex();
}
}
} // 增加一个顶点
public void addVertex(char lable) {
vertexList[nVerts++] = new Vertex(lable);
} // 增加一条边
public void addEdge(int start, int end) {
list[start][end].val = 1;
list[end][start].val = 1;
} // 打印矩阵
public void printMatrix() {
for (int i = 0; i < nVerts; i++) {
for (int j = 0; j < nVerts; j++) {
System.out.print(list[i][j].val);
}
System.out.println();
}
}
//显示字符
public void showVertex(int v) {
System.out.print(vertexList[v].lable + "\t");
}
//获得邻接未访问节点
public int getAdjUnvisitedVertex(int v) {
for(int j = 0; j < nVerts; j ++) {
if((list[v][j].val == 1) && (vertexList[j].wasvisited == false)) {
return j;
}
}
return -1;
}
//BFS
public void BFS() {
LinkedList q = new LinkedList();
vertexList[0].wasvisited = true;
showVertex(0);
q.add(0);
int ver1, ver2;
while(q.size() > 0) {
ver1 = (int) q.poll();
ver2 = getAdjUnvisitedVertex(ver1);
while(ver2 != -1) {
vertexList[ver2].wasvisited = true;
showVertex(ver2);
q.add(ver2);
ver2 = getAdjUnvisitedVertex(ver1);
}
}
for(int j = 0; j < nVerts; j ++) {
vertexList[j].wasvisited = false;
}
} }
测试程序:
public static void main(String[] args) {
BFS_Vertex ds = new BFS_Vertex();
ds.addVertex('A'); //
ds.addVertex('B'); //
ds.addVertex('C'); //2
ds.addVertex('D'); //
ds.addVertex('E'); //
ds.addEdge(0, 1); //A-B
ds.addEdge(0, 3); //A-D
ds.addEdge(1, 4); //B-E
ds.addEdge(3, 4); //D-E
ds.addEdge(4, 2); //E-C
ds.printMatrix();
ds.BFS();
}
测试结果:
01010
10001
00001
10001
01110
A B D E C
数据结构Java版之广度优先图(十三)的更多相关文章
- 数据结构Java版之深度优先-图(十二)
这里用深度优先遍历存在矩阵里面的图. 深度优先利用的是栈的FIFO特性.为此遍历到底后,可以找到最相邻的节点继续遍历.实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了. 源码 ...
- 数据结构Java版之邻接矩阵实现图(十一)
邻接矩阵实现图,是用一个矩阵,把矩阵下标作为一个顶点,如果顶点与顶点之间有边.那么在矩阵对应的点上把值设为 1 .(默认是0) package mygraph; import java.util.Li ...
- 数据结构Java版之邻接表实现图(十)
邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.u ...
- 数据结构Java版之交换算法(一)
交换的本质是拷贝,其中拷贝包括两种方式.值拷贝和指针拷贝,在java中没有指针,为此,我们可以理解为地址拷贝,在我看来,指针就是地址. 1.传值方式示例: 由上述示例可得,传值,不能起到交换的作用,原 ...
- 数据结构Java版之堆&堆排序(九)
堆分为大顶堆,和小顶堆. 什么是堆? 堆可以看成是一棵二叉树,二叉树的元素是一个数组不断的从左到右轮训放置.如果是大顶堆,则大的数放上面一层,小的数放下面一层.上一层的数,一定大于下一层的数.小顶堆则 ...
- 数据结构Java版之遍历二叉树(六)
二叉树是我们在程序中用的最多的一种树(个人观点).最简单的一个二叉树是由一个根节点,两个子节点(一左一右成左右孩子节点)组成.二叉树是数组和链表的结合,即包含了数组的快速查找优点,又包含了链表的快速添 ...
- 数据结构Java版之递归与迭代算法(五)
递归的概念很简单,就是自己调用自己. 而迭代,则是通过修改初始化数据,得到中间结果,然后不断的对中间结果进行修改,而得到最终结果.简单来说迭代就是循环. 在此,我们用一个比较经典的Fibonacci数 ...
- 数据结构Java版之基数排序(四)
基数排序: 基数排序分为两种:第一种是LSD ,从最低位开始排序, 第二种是 MSD 从最高位开始排.这里介绍第一种LSD排序算法. 首先,我们先了解什么是基数.基数是根据具体的排序情况而定的,比如我 ...
- 数据结构Java版之红黑树(八)
红黑树是一种自动平衡的二叉查找树,因为存在红黑规则,所以有效的防止了二叉树退化成了链表,且查找和删除的速度都很快,时间复杂度为log(n). 什么是红黑规则? 1.根节点必须是黑色的. 2.节点颜色要 ...
随机推荐
- css盒模型。边框和内外边距
css盒模型: 外边距 边框 内填充 内容 盒模型分为两种: 标准盒模型: 怪异盒模型(IE盒模型): 边框:border border: 10px solid blue;表示设置10像素蓝色实线条的 ...
- 74.js---移动端文章的瀑布流的实现。
移动端文章的瀑布流的实现. 1.首先在前端html页面已经通过PHP代码循环完全数据. 2.然后在js先全部隐藏,通过判断滑动到底部,每次加载一部分数据,直到数据全部显示完全. js代码: // ...
- 制作IOS ANE的基本流程
来源:http://www.swfdiy.com/?p=1239 1. 使用xcode新建ios上的static library 工程 2. 从air sdk/include里拷贝flashrunti ...
- org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案
org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的解决方案 背景描述 Sprin ...
- 关于SpringBoot下template文件夹下html页面访问的一些问题
springboot整合了springmvc的拦截功能.拦截了所有的请求.默认放行的资源是:resources/static/ 目录下所有静态资源.(不走controller控制器就能直接访问到资源) ...
- C#入门概述
ASP.NET 则是一种技术. Main方法 代码编写规范 命名规范
- SQL SERVER-解析Extendevent文件数据
--解析xel数据 select SWITCHOFFSET(n.value('@timestamp','Datetime'),'+08:00') as EventTime, n.value('(dat ...
- c# Directory类的常用方法
- Xshell 5连接上suse
# 关闭防火墙 systemctl stop SuSEfirewall2.service systemctl stop SuSEfirewall2_init.service systemctl dis ...
- 个性化排序算法实践(五)——DCN算法
wide&deep在个性化排序算法中是影响力比较大的工作了.wide部分是手动特征交叉(负责memorization),deep部分利用mlp来实现高阶特征交叉(负责generalizatio ...