《图论》——广度优先遍历算法(BFS)

简介: 十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vet中 3.

十大算法之广度优先遍历:


本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下:

用邻接矩阵存储图方法:

1.确定图的顶点个数和边的个数

2.输入顶点信息存储在一维数组vet中

3.初始化邻接矩阵;

4.依次输入每条边存储在邻接矩阵array中

输入边依附的两个顶点的序号i,j;
将邻接矩阵的第i行第j列的元素值置为1;
将邻接矩阵的第j行第i列的元素值置为1;

广度优先遍历实现:

1.初始化队列Q
2.访问顶点v;ifVisit[v]=1;顶点v入队Q;
3.while(队列Q非空)

v=队列Q的队头元素出队;
w=顶点v的第一个邻接点
while(w存在)

如果w未被访问,则访问顶点w;visited[w]=1;顶点w入队列Q

w=顶点v的下一个邻接点

如下代码参考此图完成:


实现代码如下:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class BFS {
 
	private Object[] vet;     //定义vet数组用来存放顶点信息
	private int[][] array;    //定义邻接矩阵存放图的顶点信息
	private int vexnum;       //存储边的条数
	private boolean[] ifVisit;//存放结点是否被访问过
	private List list = new ArrayList();   //定义一个临时的队列用来存放已经被访问过的结点
	
 public static void main(String[] args) {
// TODO Auto-generated method stub
	 BFS map = new BFS(5);
	 Character[] vet= {'A','B','C','D','E'};
	 map.addVet(vet);
	 map.addEage(0, 1);
	 map.addEage(0, 4);
	 map.addEage(1, 3);
	 map.addEage(2, 3);
	 map.addEage(2, 4);
	 
	 System.out.println("广度优先遍历开始:");
	 map.bfs();
 }
 //广度优先遍历
 public void bfs(){
	 Queue
    
    
      queue = new LinkedList
     
     
      ();   //定义一个队列
	 for(int i=0;i
      
      
       0;m = this.next(j, m)){
					 if(!ifVisit[m]){
						 queue.add(m);
						 ifVisit[m] = true;
						 visited(m);
					 }
				 }
			 }
		 }
		 
	 }
 }
 //获得当前结点
 public int first(int i){
	 for(int j = 0;j
       
       
         0) return j; return -1; } public int next(int i,int k){ for (int j = k + 1; j 0) return j; } return -1; } //初始化图的节点 private void addVet(Object[] object) { this.vet = object; } //往临时队列里添加已经访问过的结点,并输出 public void visited(int k){ list.add(vet[k]); System.out.print("->" + vet[k]); } //构建邻接矩阵,保存边的信息 public void addEage(int m,int n){ if(m!=n){ array[m][n]=1; array[n][m]=1; } else return; } //图的初始化 public BFS(int m){ vexnum = m; vet = new Object[m]; array = new int[m][m]; ifVisit = new boolean[m]; for(int i=0;i 
         
       
      
      
     
     
    
    

相关文章
|
11天前
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
5月前
|
存储 算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
91 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
|
11天前
|
存储 算法
算法系列之搜索算法-广度优先搜索BFS
广度优先搜索(BFS)是一种非常强大的算法,特别适用于解决最短路径、层次遍历和连通性问题。在面试中,掌握BFS的基本实现和应用场景,能够帮助你高效解决许多与图或树相关的问题。
29 1
算法系列之搜索算法-广度优先搜索BFS
|
11天前
|
存储 算法 iOS开发
【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量(通俗易懂版)
【狂热算法篇】并查集:探秘图论中的 “连通神器”,解锁动态连通性的神秘力量(通俗易懂版)
|
11天前
|
存储 算法 测试技术
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)
|
4月前
|
JSON 算法 数据挖掘
基于图论算法有向图PageRank与无向图Louvain算法构建指令的方式方法 用于支撑qwen agent中的统计相关组件
利用图序列进行数据解读,主要包括节点序列分析、边序列分析以及结合节点和边序列的综合分析。节点序列分析涉及节点度分析(如入度、出度、度中心性)、节点属性分析(如品牌、价格等属性的分布与聚类)、节点标签分析(如不同标签的分布及标签间的关联)。边序列分析则关注边的权重分析(如关联强度)、边的类型分析(如管理、协作等关系)及路径分析(如最短路径计算)。结合节点和边序列的分析,如子图挖掘和图的动态分析,可以帮助深入理解图的结构和功能。例如,通过子图挖掘可以发现具有特定结构的子图,而图的动态分析则能揭示图随时间的变化趋势。这些分析方法结合使用,能够从多个角度全面解读图谱数据,为决策提供有力支持。
160 0
|
5月前
|
机器学习/深度学习 存储 算法
数据结构与算法——BFS(广度优先搜索)
数据结构与算法——BFS(广度优先搜索)
|
7月前
|
存储 算法
BFS算法的实现
BFS算法的实现
74 1
|
8月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
105 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)