这里用深度优先遍历存在矩阵里面的图。

  深度优先利用的是栈的FIFO特性。为此遍历到底后,可以找到最相邻的节点继续遍历。实现深度优先,还需要在节点加上一个访问标识,来确定该节点是否已经被访问过了。

源码:

package mygraph;

import java.util.Stack;

public class DFS_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; // 当前顶点下标
DFS_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;
}
//DFS
public void DFS() {
Stack<Integer> s = new Stack();
vertexList[0].wasvisited = true;
showVertex(0);
s.push(0);
int v;
while(s.size() > 0) {
v = getAdjUnvisitedVertex(s.peek());
if(v == -1) {
s.pop();
}else {
vertexList[v].wasvisited = true;
showVertex(v);
s.push(v);
}
}
for(int j = 0; j < nVerts; j ++) {
vertexList[j].wasvisited = false;
}
} }

测试程序:

    public static void main(String[] args) {
DFS_Vertex ds = new DFS_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.DFS();
}

测试结果:

10001
00001
10001
01110
A B E C D

数据结构Java版之深度优先-图(十二)的更多相关文章

  1. 数据结构Java版之广度优先图(十三)

    广度优先,则是用的队列,将每一层的节点先存入队列中去,后依次取出队列中的节点,显示与当前节点存在边,但是未被访问过的节点,也就是下一层与之相联系的节点,再将这些节点存入队列.经过层层迭代,就可以完全遍 ...

  2. 数据结构Java版之排序算法(二)

    排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...

  3. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  4. 20155322 2016-2017-2 《Java面向对象程序设计》第十二周课堂练习之Arrays和String单元测试

    20155322 2016-2017-2 <Java面向对象程序设计>第十二周课堂练习之Arrays和String单元测试 练习目地 在IDEA中以TDD的方式对String类和Array ...

  5. Java多线程和并发(十二),Java线程池

    目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...

  6. 《深入理解Java虚拟机》读书笔记十二

    第十二章  Java内存模型与线程 1.硬件效率与一致性 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cac ...

  7. 数据结构Java版之邻接表实现图(十)

    邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.u ...

  8. 数据结构Java版之邻接矩阵实现图(十一)

    邻接矩阵实现图,是用一个矩阵,把矩阵下标作为一个顶点,如果顶点与顶点之间有边.那么在矩阵对应的点上把值设为 1 .(默认是0) package mygraph; import java.util.Li ...

  9. 数据结构(java版)学习笔记(二)——线性表之顺序表

    顺序表的优点: 随机存取元素方便,根据定位公式容易确定表中每个元素的存储位置,所以要指定第i个结点很方便 简单,直观 顺序表的缺点: 插入和删除结点困难 扩展不灵活,难以确定分配的空间 容易造成浪费 ...

随机推荐

  1. Matlab title正确显示下划线

    前言 使用matlab中title语句,直接敲下划线无法正确显示. title('MSB_data'); 流程 使用如下语句即可:直接字符串转译 title('MSB_data','Interpret ...

  2. UI5-技术篇-Hybrid App-3-Fiori 百度地图应用

    上一次在Jsbin中测试了百度地图应用:UI5-技术篇-Hybrid App-3-jsbin百度地图 ,主要思路:1.加载百度API  2.自定义控件  3.div标签加载地图,本文主要将相关实施过程 ...

  3. iOS 简化冗余代码

    正在给深圳某家智能家居开发iPad版本,在已经存在的iPhone版上修改,该app的界面采用的是xib.xib相比代码来写界面,快速高效,但是可维护性和可读性太差.言归正传,看到这些代码后,我的心情很 ...

  4. 使用python库relate搭建LMS学习管理系统

    Relate is an Environment for Learning And TEaching Relate是在 Django上面构建的,可以快速搭建LMS系统,该系统可以方便学习管理和在线课程 ...

  5. 01-HTML基本介绍

    本篇主要介绍HTML相关标签的使用,以及其常用标签的作用等介绍. 一.HTML的介绍 HTML是 HyperText Mark-up Language 的首字母简写,意思是超文本标记语言,超文本指的是 ...

  6. Jenkins 插件:Job Configuration History(记录job的历史更新记录)

    1. 添加插件   添加完成后,Jenkins,左下,多一个菜单栏 .可以查看,job的更新记录,见下图 .   如上,End再也不用担心,有同学乱改Job ,却不知道哪里被改的情况了. 注:1)这个 ...

  7. 分布式结构化存储系统-HBase基本架构

    分布式结构化存储系统-HBase基本架构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据领域中,除了直接以文件形式保存数据外,还有大量结构化和半结构化的数据,这类数据通常需 ...

  8. JSON空值处理与 StringUtils工具类使用

    JSON 动态查询时,需要的条件本应是null,前端传入的是" " //null转换为"" private static ValueFilter filter ...

  9. IDEA快速搭建WEB项目【记录篇】

    这里用的都是市面上通用的技术,而每个公司都有自己的调用方式,可以根据实际情况与业务场景不同去进行变通 三层架构: 界面层(User Interface layer).业务逻辑层(Business Lo ...

  10. ICS2019-Linux汇编实验指导

    ICS2019-Linux汇编实验指导 环境配好了? 开始调试 一. 首先安装NASM 1. 先判断系统是否已经安装了nasm 打开终端,执行  whereis nasm :如果显示nasm: /us ...