数据结构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.节点颜色要 ...
随机推荐
- ES6之promise原理
我在这里介绍了promise的原理: https://juejin.im/post/5cc54877f265da03b8585902 我在这里 仅仅张贴 我自己实现的简易promise——DiProm ...
- thinkphp5 使用PHPExcel 导入导出
首先下载PHPExcel类.网上很多,自行下载. 然后把文件放到vendor文件里面. 一般引用vendor里面的类或者插件用vendor(); 里面加载的就是vendor文件,然后想要加载哪个文件, ...
- Hive的五个基础介绍
一.什么是Hive? 1.Hive是一个翻译器,SQL ---> Hive引擎 ---> MR程序 2.Hive是构建在HDFS上的一个数据仓库(Data Warehouse) Hive ...
- java web编程 servlet
先从请求的信息里面获取协议,版本协议如果是1.1结尾的就报错,也就是我们常见的405报错: 405是协议请求方式错误,所以要重写doget或者dopost方法,直接调用父类的get和post方法是会报 ...
- 聊Java中的任务调度的实现方法及比较
前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz ...
- 小程序canvas绘制倒计时
如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 效果展示: //广告倒计时 advTimeCountDown:function(advTime ...
- Mac 下 安装Python3
因为Mac系统自带Python2.7 所以我们开发要重新装Python3 直接运行下面就好 luohaotiandeMacBook-Pro:~ luohaotian$ which python /us ...
- C++(三十六) — 等号操作符重载、&&,||不可重载
1.等号操作符重载,实现深拷贝 //等号运算符重载 // obj3=obj1;//原始的是浅拷贝,现在要重载为深拷贝 Name& operator=(Name &obj1) { //1 ...
- idou老师教你学istio 31:Istio-proxy的report流程
Istio-proxy的report主要是将envoy采集到的连接attributes的信息上报给控制面的mixer,它的入口在request_handler_impl.cc文件中,这里需要打开ena ...
- Java判断对象类型是否为数组
判断对象是否为数组: public static void main(String[] args) { String[] a = ["1","2"]; if(a ...