Java数据结构——图的DFS和BFS
1.图的DFS:
即Breadth First Search,深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访问B节点,如果B节点有未访问的邻近节点的话将继续访问其邻近节点,否则继续访问A的未访问邻近节点,当所有从A节点出去的路径都访问完之后,继续递归访问除A以外未被访问的邻近节点。
/*
* 深度优先遍历
*/
public void DFS(int i) {
isVisited[i] = true;
int weight = getFirstNeighbor(i);
while (weight != -1) {
if (!isVisited[weight]) {
System.out.print("v" + weight + " ");
DFS(weight);
}
weight = getNextNeighbor(i, weight);
}
} /*
* 提供访问的DFS,强制每一次的遍历,防止在有向图和非连通图中有些顶点访问不到的情况
*/
public void DFS() {
isVisited = new boolean[size];
for (int i = 0; i < size; i++) {
if (!isVisited[i]) {
System.out.print("v" + i + " ");
DFS(i);
}
}
isVisited = new boolean[size];
}
2.图的BFS:
即Breadth First Search,其主要思想是从起始点开始,将其邻近的所有顶点都加到一个队列(FIFO)中去,然后标记下这些顶点离起始顶点的距离为1.最后将起始顶点标记为已访问,今后就不会再访问。然后再从队列中取出最先进队的顶点A,也取出其周边邻近节点,加入队列末尾,将这些顶点的距离相对A再加1,最后离开这个顶点A。依次下去,直到队列为空为止。
/*
* 广度优先遍历
*/
public void BFS(int i) {
int temp, weight;
LinkedList<Integer> queue = new LinkedList<>();
System.out.print("v" + i + " ");
isVisited[i] = true;
queue.add(i);
while (!queue.isEmpty()) {
temp = queue.removeFirst().intValue();
weight = getFirstNeighbor(temp);
while (weight != -1) {
if (!isVisited[weight]) {
System.out.print("v" + weight + " ");
isVisited[weight] = true;
queue.add(weight);
}
weight = getNextNeighbor(temp, weight);
}
}
} /*
* 提供访问的BFS,强制每一次的遍历,防止在有向图和非连通图中有些顶点访问不到的情况
*
*/
public void BFS() {
isVisited = new boolean[size];
for (int i = 0; i < size; i++) {
if (!isVisited[i]) {
BFS(i);
}
}
isVisited = new boolean[size];
}
3.全部java实现:
import java.util.LinkedList;
public class Graph {
private int size; // 顶点数量
private int[] vertexs; // 顶点数组
private int[][] matrix; // 邻接矩阵
private boolean[] isVisited;
private static final int MAX_WEIGHT = 10000;
public Graph(int size) {
super();
this.size = size;
vertexs = new int[size];
for (int i = 0; i < size; i++) {
vertexs[i] = i;
}
matrix = new int[size][size];
isVisited = new boolean[size];
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int[] getVertexs() {
return vertexs;
}
public void setVertexs(int[] vertexs) {
this.vertexs = vertexs;
}
/*
* 获取指定顶点的第一个邻接点
*/
public int getFirstNeighbor(int index) {
for (int i = 0; i < matrix[index].length; i++) {
if (matrix[index][i] != 0 && matrix[index][i] != MAX_WEIGHT) {
return i;
}
}
return -1;
}
/*
* 根据前一个邻接点的下标来获取下一个邻接点
*
* @param v 表示要找的顶点
*
* @param index 表示该顶点相对于哪个邻接点去获取下一个邻接点
*/
public int getNextNeighbor(int v, int index) {
for (int i = (index + 1); i < size; i++) {
if (matrix[v][i] != 0 && matrix[v][i] != MAX_WEIGHT) {
return i;
}
}
return -1;
}
/*
* 深度优先遍历
*/
public void DFS(int i) {
isVisited[i] = true;
int weight = getFirstNeighbor(i);
while (weight != -1) {
if (!isVisited[weight]) {
System.out.print("v" + weight + " ");
DFS(weight);
}
weight = getNextNeighbor(i, weight);
}
}
/*
* 提供访问的DFS,强制每一次的遍历,防止在有向图和非连通图中有些顶点访问不到的情况
*/
public void DFS() {
isVisited = new boolean[size];
for (int i = 0; i < size; i++) {
if (!isVisited[i]) {
System.out.print("v" + i + " ");
DFS(i);
}
}
isVisited = new boolean[size];
}
/*
* 广度优先遍历
*/
public void BFS(int i) {
int temp, weight;
LinkedList<Integer> queue = new LinkedList<>();
System.out.print("v" + i + " ");
isVisited[i] = true;
queue.add(i);
while (!queue.isEmpty()) {
temp = queue.removeFirst().intValue();
weight = getFirstNeighbor(temp);
while (weight != -1) {
if (!isVisited[weight]) {
System.out.print("v" + weight + " ");
isVisited[weight] = true;
queue.add(weight);
}
weight = getNextNeighbor(temp, weight);
}
}
}
/*
* 提供访问的BFS,强制每一次的遍历,防止在有向图和非连通图中有些顶点访问不到的情况
*
*/
public void BFS() {
isVisited = new boolean[size];
for (int i = 0; i < size; i++) {
if (!isVisited[i]) {
BFS(i);
}
}
isVisited = new boolean[size];
}
public static void main(String[] args) {
Lfw_41 graph = new Lfw_41(9);
int[] a0 = new int[] { 0, 10, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT };
int[] a1 = new int[] { 10, 0, 18, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, MAX_WEIGHT, 12 };
int[] a2 = new int[] { MAX_WEIGHT, MAX_WEIGHT, 0, 22, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 8 };
int[] a3 = new int[] { MAX_WEIGHT, MAX_WEIGHT, 22, 0, 20, MAX_WEIGHT, MAX_WEIGHT, 16, 21 };
int[] a4 = new int[] { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 20, 0, 26, MAX_WEIGHT, 7, MAX_WEIGHT };
int[] a5 = new int[] { 11, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 26, 0, 17, MAX_WEIGHT, MAX_WEIGHT };
int[] a6 = new int[] { MAX_WEIGHT, 16, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 17, 0, 19, MAX_WEIGHT };
int[] a7 = new int[] { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 16, 7, MAX_WEIGHT, 19, 0, MAX_WEIGHT };
int[] a8 = new int[] { MAX_WEIGHT, 12, 8, 21, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0 };
graph.matrix[0] = a0;
graph.matrix[1] = a1;
graph.matrix[2] = a2;
graph.matrix[3] = a3;
graph.matrix[4] = a4;
graph.matrix[5] = a5;
graph.matrix[6] = a6;
graph.matrix[7] = a7;
graph.matrix[8] = a8;
System.out.print("DFS: ");
graph.DFS();
System.out.println();
System.out.print("BFS: ");
graph.BFS();
System.out.println();
}
}
图的DFS和BFS代码
Java数据结构——图的DFS和BFS的更多相关文章
- [数据结构]图的DFS和BFS的两种实现方式
深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...
- 图的DFS和BFS(邻接表)
用C++实现图的DFS和BFS(邻接表) 概述 图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...
- 图的DFS与BFS
图的DFS与BFS(C++) 概述 大一学生,作为我的第一篇Blog,准备记录一下图的基本操作:图的创建与遍历.请大佬多多包涵勿喷. 图可以采用邻接表,邻接矩阵,十字链表等多种储存结构进行储存,这里为 ...
- 数据结构(11) -- 邻接表存储图的DFS和BFS
/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...
- java 数据结构 图
以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...
- 图的DFS与BFS遍历
一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...
- 数据结构基础(21) --DFS与BFS
DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...
- java数据结构----图
1.图:.在计算机程序设计中,图是最常用的数据结构之一.对于存储一般的数据问题,一般用不到图.但对于某些(特别是一些有趣的问题),图是必不可少的.图是一种与树有些相像的数据结构,从数学意义上来讲,树是 ...
- Java数据结构——图
点 //类名:Vertex //属性: //方法: class Vertex{ public char label; //点的名称,如A public boolean wasVisited; publ ...
随机推荐
- IDEA解决MAVEN下载插件慢问题
原文链接:https://blog.csdn.net/qq_25983579/article/details/104398915 使用阿里的maven镜像 右键项目选中maven选项,然后选择“ope ...
- 菜鸟教程的 mysql-connector 基础
安装驱动 python -m pip install mysql-connector 导包 import mysql.connector mydb = mysql.connector.connect( ...
- go项目dockerfile最佳实践
1. 前言 2. 不需要cgo情况下的最佳实践 3. 依赖cgo情况下的最佳实践 1. 前言 这几天在构建golang编写的web项目中,关于dockerfile编写的一些总结 可能是单纯我比较菜(大 ...
- PHP boolval() 函数
boolval 函数用于获取变量的布尔值.高佣联盟 www.cgewang.com 版本要求:PHP 5 >= 5.5.0, PHP 7. 语法 boolean boolval ( mixed ...
- Blob分析之 ball.hdev
* ball.hdev: Inspection of Ball Bonding * 关闭窗体更新 dev_update_window ('off')*关闭窗体dev_close_window ()*打 ...
- python8.4景区买票
from threading import Threadimport threadinglock=threading.Lock()num=100#定义买票方法def sale(name): lock. ...
- Spring IoC是如何进行依赖注入的
依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...
- 利用mybatis的Generator的插件生成代码
1 在resources文件夹下创建generatorConfig.xml文件来做相关配置 <?xml version="1.0" encoding="UTF-8& ...
- 搭建 springboot selenium 网页文件转图片环境
1. 环境准备 需要有 chrome 浏览器 + chrome driver + selenium 客户端 离线 chrome 下载地址 # 64位 linux 系统 https://dl.googl ...
- java 启动Tomcat报错:The specified JRE installation does not exist
启动TomCat服务报错: The specified JRE installation does not exist 解决方法: Eclipse:window->perferences-> ...