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 ...
随机推荐
- 微服务迁移记(五):WEB层搭建(5)-集成ueditor编辑器,伪分布式图片上传
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- Label 组件基本写法
1.width,height 指定区域大小 文本 汉字 2 个字节 2.font 指定字体和字体大小 font(font_name,size) 3.image 显示在 Label 上的图像 支持 gi ...
- JavaScript Set对象
JavaScript Set对象 Set 用于存储任何类型的唯一值,无论是基本类型还是引用类型. 只有值没有键 严格类型检测存储,字符串数字不等同于数值型数字 存储的值具有唯一性 遍历顺序是添加的顺序 ...
- nginx静态资源防盗链
含义: 用于阻止 Referer 头字段为无效值的请求访问站点.需记住的是,使用适当的 Referer 字段值来伪造请求非常容易,因此本模块的预期目的不是要彻底阻止此类请求,而是阻止常规浏览器发送的大 ...
- linux的存储管理(RALD) LVM 逻辑卷管理 虚拟阵列
磁盘存储管理 LVM 逻辑卷 虚拟阵列 1.Linux系统中 磁盘使用 存在3个大问题: 1.灵活性 2.安全性 3.性能 2.解决办法RAID独立磁盘冗余阵列 RAID(Redundant Arra ...
- 【NOIP2016】天天爱跑步 题解(LCA+桶+树上差分)
题目链接 题目大意:给定一颗含有$n$个结点的树,每个结点有一个权值$w$.给定$m$条路径,如果一个点与路径的起点的距离恰好为$w$,那么$ans[i]++$.求所有结点的ans. 题目分析 暴力的 ...
- 2017面向对象程序设计(Java)第十七周助教工作总结
本学期已接近尾声,java课程也即将结束.经过一学期的java学习,相信大家已经从最初的懵懂.困惑渐渐的走向了柳暗花明,并对java的体系结构有了更加清晰的认识.但一学期的学习是远远不 ...
- 小伙子自从学会用Python爬取岛国“动作”电影,身体一天不如一天
在互联网的世界里,正确的使用VPN看看外面的世界,多了解了解世界的发展.肉身翻墙后,感受一下外面的肮脏世界.墙内的朋友叫苦不迭,由于某些原因,VPN能用的越来越少.上周我的好朋友狗子和我哭诉说自己常用 ...
- Linux本地套接字(Unix域套接字)----SOCK_DGRAM方式
目录 简述 创建服务端代码: 创建客户端代码 接收函数封装 发送封装 服务端测试main函数 客户端测试main函数 编译运行结果 简述 这里介绍一下Linux进程间通信的socket方式---Loc ...
- CentOS 7.0删除mysql服务
今天在Centos下安装mysql服务,就小记下,前面收藏了一篇安装的文档,我测试是可以用的,现在测试一下怎么删除 删除有两种方法,一种通过rpm -e进行删除 另一种通过yum remove 一.r ...