图的广度优先算法+遍历
图解
代码实现
package com.atguigu.graph;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;/*** @创建人 wdl* @创建时间 2021/4/2* @描述*/
public class Graph {private ArrayList<String> vertexList;//存储顶点集合private int[][] edges;//存储图对应的邻接矩阵private int numOfEdges;//表示边的数目//定义一个Boolean数组,记录某个节点是否被访问private boolean[] isVisited;public static void main(String[] args) {//测试一把图是否创建OKint n=5;//节点的个数String Vertexs[]={"A","B","C","D","E"};//创建图对象Graph graph = new Graph(n);//循环的添加顶点for(String vertex:Vertexs){graph.insertVertex(vertex);}//添加边graph.insertEdge(0,1,1);graph.insertEdge(0,2,1);graph.insertEdge(1,2,1);graph.insertEdge(1,3,1);graph.insertEdge(1,4,1);//显示一把邻接矩阵graph.showGraph();//测试一把,我们的dfs遍历是否OKSystem.out.println("深度优先");graph.dfs();System.out.println();//测试一把,我们的bfs遍历是否OKSystem.out.println("广度优先");graph.bfs();}//构造器public Graph(int n) {//初始化矩阵和vertexListedges = new int[n][n];vertexList = new ArrayList<>(n);numOfEdges=0;
// isVisited=new boolean[5];}//得到第一个邻接节点的下标w/**** @param index* @return 如果存在就返回对应的下标,否则返回-1*/public int getFirstNeighbor(int index){for (int j = 0; j < vertexList.size(); j++) {if(edges[index][j]>0){return j;}}return -1;}//根据前一个邻接节点的下标来获取下一个邻接节点public int getNextNeighbor(int v1,int v2){for(int j=v2+1;j<vertexList.size();j++){if(edges[v1][j]>0){return j;}}return -1;}//深度优先遍历算法//i 第一次就是0public void dfs(boolean[] isVisited,int i){//首先我们访问该节点,输出System.out.print(getValueByIndex(i)+"->");//将节点设置为已经访问isVisited[i]=true;//查找i的第一个邻接节点wint w=getFirstNeighbor(i);while (w!=-1){//说明有if(!isVisited[w]){dfs(isVisited,w);}//如果w节点已经被访问过w=getNextNeighbor(i,w);}}//对dfs进行一个重载,遍历我们所有的节点,并进行dfspublic void dfs(){isVisited=new boolean[5];//遍历所有的节点,进行dfs[回溯]for (int i = 0; i < getNumOfVertex(); i++) {if(!isVisited[i]){dfs(isVisited,i);}}}//对一个节点进行广度优先遍历的方法public void bfs(boolean[] isVisited,int i){int u;//表示队列的头节点对应下标int w;//邻接节点w//队列,记录节点访问的顺序LinkedList queue = new LinkedList();//访问节点,输出节点信息System.out.print(getValueByIndex(i)+"=>");//标记为已访问isVisited[i]=true;//将节点加入队列queue.addLast(i);while (!queue.isEmpty()){//取出队列的头节点下标u = (Integer) queue.removeFirst();//得到第一个邻接点的下标ww=getFirstNeighbor(u);while (w!=-1){//找到了//是否访问过if(!isVisited[w]){System.out.print(getValueByIndex(w)+"=>");//标记已经访问isVisited[w]=true;//入队queue.addLast(w);}//以u为前驱点,找w后面的下一个邻接点w=getNextNeighbor(u,w);//体现出我们的广度优先}}}//遍历所有的节点,都进行广度优先搜索public void bfs(){isVisited=new boolean[5];for (int i = 0; i < getNumOfEdges(); i++) {if(!isVisited[i]){bfs(isVisited,i);}}}//图中常用的方法//返回节点的个数public int getNumOfVertex(){return vertexList.size();}//显示图对应的矩阵public void showGraph(){for(int[] link:edges){System.out.println(Arrays.toString(link));}}//得到边的数目public int getNumOfEdges(){return numOfEdges;}//返回节点i(下标)对应的数据public String getValueByIndex(int i){return vertexList.get(i);}//返回v1和v2的权值public int getWeight(int v1,int v2){return edges[v1][v2];}//插入节点public void insertVertex(String vertex){vertexList.add(vertex);}//添加边/**** @param v1 表示点的下标是第几个顶点 "A"-"B" "A"->0 "B"->1* @param v2 第二个顶点对应的下标* @param weight*/public void insertEdge(int v1,int v2,int weight){edges[v1][v2]=weight;edges[v2][v1]=weight;numOfEdges++;}}
图的广度优先算法+遍历相关推荐
- (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)
链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构 队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...
- 图的广度优先搜索遍历
广度优先搜索遍历 广度优先搜索遍历类似与树的层次遍历,过程如下: (1) 从图中的某个顶点v出发,访问v (2) 依次访问v的各个未曾访问的邻接点 (3) 分别从这些邻接点出发依次访问他们的邻接点,并 ...
- 彻底搞懂图的广度优先算法
广度优先算法 从算法的思想,算法步骤,代码实现与分析,最后"debug+图解"展示展开 会有一定的图示,以便于更好的理解(博主的自我思考,如有错误,欢迎指正) 需要源码与相关图解 ...
- 数据结构与算法--图的广度优先搜索 (BFS)
广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...
- 图的广度优先搜索算法
图的广度优先算法是利用队列先进先出的特点搜索的,由起点分层遍历. 算法如下 void BFS-Traversal(Graph G,Vertex v){Queue q;bool visited[maxs ...
- 《数据结构》实验报告六:图的表示与遍历
一.实验目的 1.掌握图的邻接矩阵和邻接表表示 2.掌握图的深度优先和广度优先搜索方法 3.理解图的应用方法 二.实验预习 说明以下概念 1.深度优先搜索遍历: 一种图的遍历方式:从图中任意一个起始 ...
- 深度优先算法和广度优先算法
深度优先算法和广度优先算法 介绍 图的定义 邻接表 邻接矩阵 广度优先算法 广度优先算法的实现 广度优先算法的应用 深度优先算法 深度优先算法的实现 后续 介绍 在数据结构中,树和图可以说是不可或缺的 ...
- 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)
文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...
- 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)
目录 ○树的层次遍历: 题:leetcode102: 广度优先优先遍历: 代码模板(来源:labuladong算法小抄): 图的广度优先遍历是树的层次遍历的拓展 ○树的层次遍历: 按照数的高度从上到下 ...
最新文章
- 微服务为什么一定要选spring cloud?
- 构建更好的敏捷项目管理组织所需的4种工具
- cocos2dx基础篇(9)——触碰事件Touch
- 快速时钟开始游戏4399html5,HTML5 简单页面实现时钟效果
- 数据分析与挖掘实战-家用电器用户行为分析与事件识别
- lofter 爬虫_本日Lofter德哈tag榜单 20201125
- 【渝粤教育】国家开放大学2018年春季 3922T汽车运用基础 参考试题
- Kafka从上手到实践 - 庖丁解牛:Producer | 凌云时刻
- 公司与公司保密协议范本
- LM1875小功放电路解析与调校(出好声音)
- 微信小程序 数组 Json 导出到excel
- 前端工程师的摸鱼日常(1)
- maven中的ArtifactId和groupId是什么
- Java 基础——HashMap 遍历方式
- 宽依赖和窄依赖_Spark宽依赖和窄依赖深度剖析
- SAP 设置周期性的后台程序,SM36,图解操作 (转)
- 黑中介北京链家,收了中介费,不给你服务
- flash php个人站_PHP Flash整站系统
- 增强现实技术漫谈(续)——研究内容全面解析
- HDU-1207 汉诺塔II
热门文章
- 牛客题霸 [ 寻找峰值] C++题解/答案
- [ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)
- AtCoder4515 [AGC030F] Permutation and Minimum(dp)
- [CTSC2017]吉夫特(思维+巧妙)
- [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)
- P3515-[POI2011]Lightning Conductor【整体二分,决策单调性】
- P3586-[POI2015]LOG【线段树】
- P4294-[WC2008]游览计划【斯坦纳树】
- P1903-[国家集训队]数颜色/维护队列【带修莫队】
- P3076,jzoj3187-的士【贪心】