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的更多相关文章

  1. [数据结构]图的DFS和BFS的两种实现方式

    深度优先搜索 深度优先搜索,我们以无向图为例. 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发, ...

  2. 图的DFS和BFS(邻接表)

    用C++实现图的DFS和BFS(邻接表) 概述   图的储存方式有邻接矩阵和邻接表储存两种.由于邻接表的实现需要用到抽象数据结构里的链表,故稍微麻烦一些.C++自带的STL可以方便的实现List,使算 ...

  3. 图的DFS与BFS

    图的DFS与BFS(C++) 概述 大一学生,作为我的第一篇Blog,准备记录一下图的基本操作:图的创建与遍历.请大佬多多包涵勿喷. 图可以采用邻接表,邻接矩阵,十字链表等多种储存结构进行储存,这里为 ...

  4. 数据结构(11) -- 邻接表存储图的DFS和BFS

    /////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS //////////////// ...

  5. java 数据结构 图

    以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客,主要是在自己理解的基础上进行记录. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示 ...

  6. 图的DFS与BFS遍历

    一.图的基本概念 1.邻接点:对于无向图无v1 与v2之间有一条弧,则称v1与v2互为邻接点:对于有向图而言<v1,v2>代表有一条从v1到v2的弧,则称v2为v1的邻接点. 2.度:就是 ...

  7. 数据结构基础(21) --DFS与BFS

    DFS 从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到(使用堆栈). //使用邻接矩阵存储的无向图的深度 ...

  8. java数据结构----图

    1.图:.在计算机程序设计中,图是最常用的数据结构之一.对于存储一般的数据问题,一般用不到图.但对于某些(特别是一些有趣的问题),图是必不可少的.图是一种与树有些相像的数据结构,从数学意义上来讲,树是 ...

  9. Java数据结构——图

    点 //类名:Vertex //属性: //方法: class Vertex{ public char label; //点的名称,如A public boolean wasVisited; publ ...

随机推荐

  1. 第十二章 类加载器&反射

    12.1.类加载器 12.1.1.类加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载.类的连接.类的初始化这三个步骤来对类进行初始化.如果不出现意外情况,JVM将会连续完成 ...

  2. PHP ignore_user_abort() 函数

    实例 设置为 false(默认)- 与客户机断开会终止脚本的执行: <?phpignore_user_abort();?>高佣联盟 www.cgewang.com 上面代码的输出如下: 0 ...

  3. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  4. 项目积累————关于map的getOrDefault用法

    今天在学习领导的编程手法时,注意到了以前没用过的一个方法,那就是map的getOrDefault,看了一下感觉这个方法的用途还是非常广泛的,比如可以实现一个简单的通讯录的功能.下面看我写的一个测试类. ...

  5. 用python包xlwt将数据写入Excel中

    一般用两种格式的数据写入,不多说放上demo. 1.列表形式写入 import xlwt def data_write(file_path, datas): f = xlwt.Workbook() s ...

  6. C++类、函数、指针

    1.初始化所有指针. 2. (1)指向常量的指针: (2)常量指针:指针本身为常量: 3.若循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环. 4.字符数组要注意字符串字面值 ...

  7. Idea Live Temlpates 自定义代码

    Idea Live Temlpates 自定义代码 目的 - 加快常用代码的书写 使用## 打开Settings 快捷键Ctrl+Alt+S 选中Live Templates 选中temlpates ...

  8. 物联网实验Arduino(1)

    回顾 我们使用的平台: Arduino 入门实验1 眨眼睛 /* Blink Turns an LED on for one second, then off for one second, repe ...

  9. 比PS还好用!Python 20行代码批量抠图

    你是否曾经想将某张照片中的人物抠出来,然后拼接到其他图片上去,从而可以即使你在天涯海角,我也可以到此一游? 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在 ...

  10. Java 的几种运算符

    一.原码.反码.补码 1 用二进制表示 00000001 -1 如果只变符号位(原码) 10000001 那么 1 + -1 = 10000010 = -2 -1 的反码 11111110 除去符号位 ...