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 ...
随机推荐
- Django学习路14_获取数据库中用户名字并展示,获取指定条数
在 views.py 中添加 获取函数 注:此时获取的是全部用户的信息 def get_users(request): users = User.objects.all() context = { ' ...
- PHP 标量类型与返回值类型声明
标量类型声明 默认情况下,所有的PHP文件都处于弱类型校验模式. PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式: 强制模式 (默认) 严格模式 标量类型声明语法格式: declare( ...
- PDO::exec
PDO::exec — 执行一条 SQL 语句,并返回受影响的行数(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 int PDO::exec ( str ...
- electron开发 - mac关闭和隐藏窗口
针对mac平台的app let willQuitApp = false; // 控制退出方式 mainWindow.on('close', (e) => { if (willQuitApp) { ...
- MapReduce之GroupingComparator分组(辅助排序、二次排序)
指对Reduce阶段的数据根据某一个或几个字段进行分组. 案例 需求 有如下订单数据 现在需要找出每一个订单中最贵的商品,如图 需求分析 利用"订单id和成交金额"作为key,可以 ...
- python6.3类的继承与多态
class Animal(object): def __init__(self,color): self.color=color def eat(self): print("动物在吃!&qu ...
- kubeadm部署1.17.3[基于Ubuntu18.04]
基于 Ubuntu18.04 使用 kubeadm 部署Kubernetes 1.17.3 高可用集群 环境 所有节点初始化 # cat <<EOF>> /etc/hosts ...
- Java 命令行 编译、执行、打包
Java 命令行 编译.执行.打包 一般来说 IDE 能够很方便的编译打包. 我写这篇文章是遇到了不能使用 IDE 的情况,简单记录一下,不做深入探讨. 环境 linux jdk 1.8 简单的编译执 ...
- 内网 Maven 编译
内网 Maven 编译 有个特殊的需求,在不联网的情况下编译 Java 项目. 想到两种方案: 搭建 Nexus 私有镜像仓库. 直接把依赖 jar包 放在编译机的 maven 本地库中. 步骤简述 ...
- 性能分析(6)- 如何迅速分析出系统 CPU 的瓶颈在哪里
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 在做性能测试时,我们会需要对 Linux 系 ...