图解

代码实现

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++;}}

图的广度优先算法+遍历相关推荐

  1. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  2. 图的广度优先搜索遍历

    广度优先搜索遍历 广度优先搜索遍历类似与树的层次遍历,过程如下: (1) 从图中的某个顶点v出发,访问v (2) 依次访问v的各个未曾访问的邻接点 (3) 分别从这些邻接点出发依次访问他们的邻接点,并 ...

  3. 彻底搞懂图的广度优先算法

     广度优先算法 从算法的思想,算法步骤,代码实现与分析,最后"debug+图解"展示展开 会有一定的图示,以便于更好的理解(博主的自我思考,如有错误,欢迎指正) 需要源码与相关图解 ...

  4. 数据结构与算法--图的广度优先搜索 (BFS)

    广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...

  5. 图的广度优先搜索算法

    图的广度优先算法是利用队列先进先出的特点搜索的,由起点分层遍历. 算法如下 void BFS-Traversal(Graph G,Vertex v){Queue q;bool visited[maxs ...

  6. 《数据结构》实验报告六:图的表示与遍历

    一.实验目的 1.掌握图的邻接矩阵和邻接表表示 2.掌握图的深度优先和广度优先搜索方法 3.理解图的应用方法 二.实验预习  说明以下概念 1.深度优先搜索遍历: 一种图的遍历方式:从图中任意一个起始 ...

  7. 深度优先算法和广度优先算法

    深度优先算法和广度优先算法 介绍 图的定义 邻接表 邻接矩阵 广度优先算法 广度优先算法的实现 广度优先算法的应用 深度优先算法 深度优先算法的实现 后续 介绍 在数据结构中,树和图可以说是不可或缺的 ...

  8. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

    文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...

  9. 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)

    目录 ○树的层次遍历: 题:leetcode102: 广度优先优先遍历: 代码模板(来源:labuladong算法小抄): 图的广度优先遍历是树的层次遍历的拓展 ○树的层次遍历: 按照数的高度从上到下 ...

最新文章

  1. 微服务为什么一定要选spring cloud?
  2. 构建更好的敏捷项目管理组织所需的4种工具
  3. cocos2dx基础篇(9)——触碰事件Touch
  4. 快速时钟开始游戏4399html5,HTML5 简单页面实现时钟效果
  5. 数据分析与挖掘实战-家用电器用户行为分析与事件识别
  6. lofter 爬虫_本日Lofter德哈tag榜单 20201125
  7. 【渝粤教育】国家开放大学2018年春季 3922T汽车运用基础 参考试题
  8. Kafka从上手到实践 - 庖丁解牛:Producer | 凌云时刻
  9. 公司与公司保密协议范本
  10. LM1875小功放电路解析与调校(出好声音)
  11. 微信小程序 数组 Json 导出到excel
  12. 前端工程师的摸鱼日常(1)
  13. maven中的ArtifactId和groupId是什么
  14. Java 基础——HashMap 遍历方式
  15. 宽依赖和窄依赖_Spark宽依赖和窄依赖深度剖析
  16. SAP 设置周期性的后台程序,SM36,图解操作 (转)
  17. 黑中介北京链家,收了中介费,不给你服务
  18. flash php个人站_PHP Flash整站系统
  19. 增强现实技术漫谈(续)——研究内容全面解析
  20. HDU-1207 汉诺塔II

热门文章

  1. 牛客题霸 [ 寻找峰值] C++题解/答案
  2. [ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)
  3. AtCoder4515 [AGC030F] Permutation and Minimum(dp)
  4. [CTSC2017]吉夫特(思维+巧妙)
  5. [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)
  6. P3515-[POI2011]Lightning Conductor【整体二分,决策单调性】
  7. P3586-[POI2015]LOG【线段树】
  8. P4294-[WC2008]游览计划【斯坦纳树】
  9. P1903-[国家集训队]数颜色/维护队列【带修莫队】
  10. P3076,jzoj3187-的士【贪心】