java实现广度优先算法
实现思路
广度优先方式,是一种地毯式搜索,层层递进的方式,即从开始节点依次遍历相邻节点,层层递进
代码实现
基于之前图的数据结构,实现广度优先算法
import java.util.*;/*** 邻接表方式,存储无向图* 使用连表的数组结构进行图信息的保存* 数组的下标代表的是图顶点本身,下标位置的连表,分别代表相连接的顶点信息*/
public class UndiGraph {/*** 标识图中顶点的个数*/private int point;/*** 定义邻接表*/private LinkedList<Integer> adjacencyList[];/*** 构造方法,初始化数据* @param point*/public UndiGraph(int point){this.point = point;// 初始化连接表数组adjacencyList = new LinkedList[point];for (int i = 0; i < point; i++) {// 初始化邻接表的每一个槽位的连表adjacencyList[i] = new LinkedList<>();}}/*** 向图中,添加顶点和边的信息* @param s 源节点* @param t 目标节点*/public void addPoint(int s,int t) {// 数组的下标,代表当前顶点,连表的数据代表的临边数据adjacencyList[s].add(t);// 因为没有方向,两个节点是互联关系,因此目标节点连线出也有源节点adjacencyList[t].add(s);}/*** bfs 广度优先算法实现,选择一条线路* 地毯式搜索,层层递进,直到找到为止* @param f 开始顶点* @param t 目标顶点*/public void bfs(int f,int t){if (f == t){return;}// 定义一个boolean类型的数组,用来记录顶点是否被访问过boolean[] visited = new boolean[this.point];// 表明起始顶点已经被访问visited[f] = true;/*** 定义一个队列,存储已经被访问过的顶点,但是还有相邻顶点未被访问*/Queue<Integer> queue = new LinkedList<>();queue.add(f);/*** 定义数组,用来存储s到t的线路,* 原理:每一个下标,代表的当前节点的值,而数组下标位置对应的数,就是指向自己的节点* 初始化为-1,代表每个节点,没有来源*/int[] prev = new int[this.point];// 初始化线路为-1initRouter(prev);/*** 循环访问队列中没有被访问的顶点* 当队列不为空的时候,进行循环*/while (!queue.isEmpty()){// 取出队列中的顶点,获取相邻顶点进行访问Integer p = queue.poll();// 遍历顶点的相邻顶点for (int i = 0; i < this.adjacencyList[p].size(); i++) {// 获取当前节点所连接的点Integer sibiling = this.adjacencyList[p].get(i);// 判断节点是否有被访问过,未访问过,则进行访问操作if (!visited[sibiling]){prev[sibiling] = p;if (sibiling==t){printRouterST(prev,f,t);return;}// 标记visited[sibiling] = true;// 相邻顶点存入队列queue.add(sibiling);}}}}/*** 初始化路线* @param router*/public void initRouter(int[] router){for (int i = 0; i < router.length; i++) {router[i] = -1;}}/*** 打印s到t的路线* @param prev* @param s* @param t*/public void printRouterST(int[] prev,int s,int t){if (prev[t] != -1 && s != t){// prev记录的是当前路线,因此向前追溯,一直到开始节点依次打印printRouterST(prev,s,prev[t]);}System.out.print(t+">>");}public static void main(String[] args) {UndiGraph undiGraph = new UndiGraph(8);undiGraph.addPoint(0,1);undiGraph.addPoint(0,3);undiGraph.addPoint(1,2);undiGraph.addPoint(1,4);undiGraph.addPoint(2,5);undiGraph.addPoint(3,4);undiGraph.addPoint(4,5);undiGraph.addPoint(4,6);undiGraph.addPoint(5,7);undiGraph.addPoint(6,7);//undiGraph.bfs(0,7);undiGraph.bfsAllRouter(0,7);}
}
java实现广度优先算法相关推荐
- 刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java)
刷题 BFS 广度优先算法 : 大胖子走迷宫 (python, java) https://www.lanqiao.cn/problems/234/learning/ http://lx.lanqia ...
- java广度优先算法,算法之广度优先搜索
一.引言 上一次介绍的算法是深度优先搜索 这次我们来研究一下广度优先搜索,看看怎么理解以及写出这个算法 这个算法需要数据结构的基础--队列,如果没有这个基础的同学去恶补一下. 二.小小问题 Q:在一个 ...
- 广度优先算法和深度优先算法-树形结构(层级结构)-Java
广度优先算法和深度优先算法-树形结构(层级结构)-Java 目录 文章目录 1.前言 2.递归 3.栈+深度优先算法 4.队列+广度优先算法 5.比较 ***后记*** : 内容 1.前言 在日常应用 ...
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
- 广度优先算法之狄克斯特拉算法
广度优先算法之狄克斯特拉算法 package cn.wizzer.common.util; import java.util.ArrayList; import java.util.HashMap; ...
- Java 数据结构和算法(十五):无权无向图
Java数据结构和算法(十五)--无权无向图 前面我们介绍了树这种数据结构,树是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合,把它叫做"树"是因为它看起 ...
- 高龄白菜java学习第103天(java数据结构和算法(21))
第七章:图 一.图的创建 思路分析 1.用一个String数组保存顶点 2.用一个二维数组保存邻接矩阵 3.通过方法实现顶点之间边的添加和计数 package Graph;import java.ut ...
- 数据结构 - Java -韩顺平 图解Java数据结构和算法
数据结构 Lesson 1 数据结构的知识总结 1. 几个经典的算法面试题 2. 线性结构与非线性结构 2.1 稀疏数组 sparsearray 2.2 队列 2.2.1 顺序队列: 2.2.2 环形 ...
- 一.Java数据结构与算法:如何开始
数据结构和算法是计算机科学的核心概念之一,它们在软件开发中起着至关重要的作用.学习Java数据结构和算法不仅有助于提高编程能力,还能让你在面试和职业发展中脱颖而出.本文将为你介绍数据结构和算法的重要性 ...
最新文章
- 面试官灵魂的一击:你懂MySQL事务吗?
- 在web项目中发布jaxws
- lazy ideas in programming(编程中的惰性思想)
- C#图解教程 第六章 深入理解类
- 前端学习(1341):mongoose验证规则延伸
- Origin绘制区间图,并添加折线
- zabbix mysql.status_zabbix 监控mysql状态
- element-ui upload组件 上传文件类型限制
- IOS之Objective-C学习 工厂模式
- 一招搞定让标签title属性值换行
- MATLAB实现滚动密钥密码
- vue.js安装步骤教程
- Win 10 添加多国语言
- 随机数字表法计算机分配,随机数表法.ppt
- 如何理解泰勒展开式,他有何用途?
- 概率笔记5——概率分布
- 「分块」数列分块入门1 – 9 by hzwer 解题记录
- 微信响应菜单点击事件php,微信开发实现各种消息的响应
- 将blogbus博客搬家至百度空间
- 2019届互联网校招高薪清单