图的广度优先遍历

1.广度优先遍历是连通图的一种遍历策略。其基本思想如下:

1)、从图中某个顶点V0出发,并访问此顶点;

2)、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;

3)、重复步骤2,直到全部顶点都被访问为止。

2.例如下图

1).从0开始,首先找到0的关联顶点3,4

2).由3出发,找到1,2;由4出发,找到1,但是1已经遍历过,所以忽略。

3).由1出发,没有关联顶点;由2出发,没有关联顶点。

所以最后顺序是0,3,4,1,2

3.下面是基于Java的代码实现

 1 int rs[] = new int[100];               //访问结果集
 2 int k = 0;                             //访问结果集计数
 3
 4  void bfs(int[][] map, int v) {
 5
 6         int max = map.length;
 7         int size = max + 1;
 8         int queue[] = new int[size];
 9
10         int front = 0;
11         int rear = 0;
12
13         int visited[] = new int[max];
14
15         visited[v] = 1;
16         rear = (rear + 1) % size;
17         queue[rear] = v;
18
19         rs[k++] = v;
20
21         while (rear != front) {
22
23             front = (front + 1) % size;
24             int w = queue[front];
25             for (int i = 0; i < map[w].length; i++) {
26                 if (map[v][i] != 0 && visited[i] == 0) {
27                     rear = (rear + 1) % size;
28                     queue[rear] = i;
29                     visited[i] = 1;
30                     rs[k++] = i;
31                 }
32             }
33         }
34
35     }
时间: 2024-08-06 14:11:38

图的广度优先遍历的相关文章

数据结构(C实现)------- 图的广度优先遍历

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 算法描述: 设图G的初始状态是所有顶点均未被访问过,在G中的任选一顶点vi为初始出发点,则广度优先遍历 可定义如下:首先,访问初始出发点vi,接着依次访问vi的所有邻接点w1,w2,...,wk;然后,依次访问w1,w2,...,wk 的邻接的所有未被访问过的顶点,依次类推,直到图中所有的和初始点vi有路径相通的顶点都被访问过为止. 算法实现: (1) 访问初始顶点vi (

PTA 邻接表存储图的广度优先遍历(20 分)

6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储的图,定义如下: /* 邻接点的定义 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /*

6-1 邻接表存储图的广度优先遍历 (20 分)

6-1 邻接表存储图的广度优先遍历 (20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储的图,定义如下: /* 邻接点的定义 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /

图的广度优先遍历和深度优先遍历

图是一种很重要的数据结构,在我们的编程生活中应用极其广泛 #include <iostream> using namespace std; #define INFINITY 32767 #define MAX_VEX 20 //最大顶点个数 #define QUEUE_SIZE (MAX_VEX+1) //队列长度 bool *visited; //访问标志数组 //图的邻接矩阵存储结构 typedef struct { char *vexs; //顶点向量 int arcs[MAX_VEX]

算法学习 - 图的广度优先遍历(BFS) (C++)

广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不懂的人.请先学下图的存储方法.在我的之前博客里. 传送门:图表示方法 然后我们如果有一个图例如以下: 节点1->3->NULL 节点2->NULL 节点3->2->4->NULL 节点4->1->2->NULL 这样我们已经知道这是一个什么图了. 如果我们

浅谈图的广度优先遍历

一.广度优先遍历 上次我们浅谈了图的深度优先遍历,接下来我们使用广度优先搜索来遍历这个图: 这五个顶点被访问的顺序如下图所示: 二.实现过程 广度优先搜索过程如下: 首先以一个未被访问过的顶点作为起始顶点,比如以1号顶点为起点. 将1号顶点放入到队列中,然后将与1号顶点相邻的未访问过的顶点,即2号.3号和5号顶点依次放入到队列中. 接下来再将2号顶点相邻的未访问过的4号顶点放入到队列中. 到此所有顶点都被访问过,遍历结束. 广度优先遍历的主要思想: 首先以一个未被访问过的顶点作为起始顶点,访问其

最少转机——图的广度优先遍历

描述:如图(无向图),5个城市,7调路线,用广度优先求从城市1到达城市5需要转机最少次数. 1 import java.util.Scanner; 2 import java.util.LinkedList; 3 public class One { 4 public static void main(String args[]){ 5 int m,r,s,e; 6 Scanner scanner=new Scanner(System.in); 7 System.out.println("请输入

图的广度优先遍历补分

要求 写出附图从每个顶点出发的一次广度优先搜索遍历序列. 在纸上画出遍历过程和序列,提交截图,注意写上学号和姓名. 过程 从某个顶点例如从A出发,访问该顶点的所有邻接点BDE 从邻接点出发,再访问他们各自的所有邻接点 重复上述步骤,直到访问所有点. 广度优先搜索在搜索访问一层时,需要记住已被访问的顶点,以便在访问下层顶点时,从已被访问的顶点出发搜索访问其邻接点.所以在广度优先搜索中需要设置一个队列Queue,使已被访问的顶点顺序由队尾进入队列.

20162312图的广度优先遍历补分博客

要求: 写出附图从每个顶点出发的一次广度优先搜索遍历序列. 在纸上画出遍历过程和序列,提交截图,注意写上学号和姓名. 过程: 1.先访问完当前顶点的所有邻接点. 2.先访问顶点的邻接点先于后访问顶点的邻接点被访问.