图的遍历BFS广度优先搜索
图的遍历BFS广度优先搜索
1. 简介
BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点“死磕到底“的思维不同,广度优先算法关注的重点在于每一层的结点进行的下一层的访问。
2. BFS算法介绍
BFS算法和核心思路就是:从某个点一直把其邻接点走完,然后任选一个邻接点把与之邻接的未被遍历的点走完,如此反复走完所有结点。类似于树的层序遍历。
BFS的核心就是要把当前在哪作为一个状态存储,并将这个状态交给队列进行入队操作,故而,
算法步骤(用队列实现)
a) 访问指定起始点。
b) 访问当前顶点的邻接顶点有未被访问的顶点,并将之放入队列中。
c) 删除队列的队首节点。访问当前队列的队首,前面的步骤。直到队列为空。
d) 若若途中还有顶点未被访问,则再选一个点作为起始顶点。重复前面的步骤。(针对非连通图)。
3. 案例图示
4. 相关代码
BFS的模板代码如下:
/**
* 返回合适的检索数据
*/
int BFS(Node root, Node target)
{
Queue<Node> queue; //创建队列
int step = 0; // 当前队列的步骤点
// initialize
add root to queue;
// BFS
while (queue is not empty)
{
step = step + 1;
//步数逐渐增加
int size = queue.size();
for (int i = 0; i < size; ++i)
{
Node cur = the first node in queue;
if cur is target
return step - 1;
for (Node next : the neighbors of cur)
{//这里常用一个二维方向数组实现
add next to queue;
}
remove the first node from queue;
}
}
return -1; //出错返回值
}
完整代码:
#include<iostream>
using namespace std;
#define matrix_size 20
typedef struct {
int weight;
}AdjMatrix[matrix_size][matrix_size]; struct Queue{
int data;
Queue* next;
}; struct MGraph{
int vex[matrix_size];
AdjMatrix arcs;
int vexnum,arcnum;
};
bool visited[matrix_size]; int LocateVex(MGraph *G ,int v){
int i;
for ( i = 0; i < G->vexnum; i++)
{
if (G->vex[i]==v)
{
break;
}
}
if (i>G->vexnum)
{
cout<<"not such vertex"<<endl;
return -1;
}
return i;
}
//构造无向图
void CreateDN(MGraph *G){
cin>>G->vexnum>>G->arcnum;
for (int i = 0; i < G->vexnum; i++)
{
cin>>G->vex[i];
}
for (int i=0; i<G->vexnum; i++) {
for (int j=0; j<G->vexnum; j++) {
G->arcs[i][j].weight=0;
}
}
for (int i = 0; i < G->arcnum; i++)
{
int v1,v2;
cin>>v1>>v2;
int n=LocateVex(G,v1);
int m=LocateVex(G,v2);
if (m==-1||n==-1)
{
cout<<"not this vertex"<<endl;
return ;
}
G->arcs[n][m].weight=1;
G->arcs[m][n].weight=1;
} return ;
}
//输出函数
void PrintGrapth(MGraph G)
{
for (int i = 0; i < G.vexnum; i++)
{
for (int j = 0; j < G.vexnum; j++)
{
cout<<G.arcs[i][j].weight<<" ";
}
cout<<endl;
}
}
void visitVex(MGraph G,int v){
cout<<G.vex[v]<<" ";
}
int FirstAdjVex(MGraph G,int v){
for (int i = 0; i < G.vexnum; i++)
{
//查找与数组下标为v的顶点之间有边的顶点,返回它在数组中的下标
if (G.arcs[v][i].weight)
{
return i;
}
}
return -1;
}
int NextAdjVex(MGraph G,int v,int w)
{
//从前一个访问位置w的下一个位置开始,查找之间有边的顶点
for(int i = w+1; i<G.vexnum; i++){
if(G.arcs[v][i].weight){
return i;
}
}
return -1;
} Queue* InitQueue(){
Queue* Q=new Queue;
Q->next=NULL;
return Q;
} //顶点元素v进队列
void EnQueue(Queue * Q,int v){
Queue *element = new Queue;
element->data=v;
element->next=NULL;
Queue* temp=Q;
while (temp->next!=NULL)
{
temp=temp->next;
}
temp->next=element;
// cout<<"in enqueue "<<element->data<<" ";
} //队头元素出队列
Queue * DeQueue(Queue *Q,int *u){
(*u)=Q->next->data;
Q=Q->next;
return Q;
} //判断队列是否为空
bool QueueEmpty(Queue *Q){
if (Q->next==NULL)
{
return true;
}
return false;
} //广度优先搜索
void BFSTraverse(MGraph G){
int v;
for ( v = 0; v < G.vexnum; v++)
{
visited[v]=false;
}
Queue * Q;
Q=InitQueue();
for (v=0 ; v <G.vexnum ; v++)
{
if (!visited[v])
{
visited[v]=true;
visitVex(G,v);
EnQueue(Q,G.vex[v]);
while (!QueueEmpty(Q))
{
int u;
Q=DeQueue(Q,&u);
u = LocateVex(&G,u);
for (int w=FirstAdjVex(G, u); w>=0; w=NextAdjVex(G, u, w)) {
if (!visited[w]) {
visited[w]=true;
visitVex(G, w);
EnQueue(Q, G.vex[w]);
}
} } }
} } int main() {
MGraph G;//建立一个图的变量
CreateDN(&G);//初始化图
BFSTraverse(G);//广度优先搜索图
return 0;
}
结果:
8 9
1 2 3 4 5 6 7 8
1 2
2 4
2 5
4 8
5 8
1 3
3 6
6 7
7 3
1 2 3 4 5 6 7 8
图的遍历BFS广度优先搜索的更多相关文章
- 图的遍历BFS
图的遍历BFS 广度优先遍历 深度优先遍历 可以进行标记 树的广度优先遍历,我们用了辅助的队列 bool visited[MAX_VERTEX_NUM] //访问标记数组 //广度优先遍历 void ...
- python 实现图的深度优先和广度优先搜索
在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...
- 0算法基础学算法 搜索篇第二讲 BFS广度优先搜索的思想
dfs前置知识: 递归链接:0基础算法基础学算法 第六弹 递归 - 球君 - 博客园 (cnblogs.com) dfs深度优先搜索:0基础学算法 搜索篇第一讲 深度优先搜索 - 球君 - 博客园 ( ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- [MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索
一.图 在正式进入广度优先搜索的学习前,先了解下图: 图分为有向图和无向图,由点vertices和边edges构成.图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和 ...
- BFS广度优先搜索 poj1915
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 25909 Accepted: 12244 Descri ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- GraphMatrix::BFS广度优先搜索
查找某一结点的邻居: virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点 virtual int nextNbr(int i, ...
- 步步为营(十六)搜索(二)BFS 广度优先搜索
上一篇讲了DFS,那么与之相应的就是BFS.也就是 宽度优先遍历,又称广度优先搜索算法. 首先,让我们回顾一下什么是"深度": 更学术点的说法,能够看做"单位距离下,离起 ...
随机推荐
- anaconda的报错:Anaconda:There is an instance of anaconda navigator already running error
anaconda的报错:Anaconda:There is an instance of anaconda navigator already running error 出现这个问题的时候人蒙了,主 ...
- 一篇文章让你搞懂如何通过Nginx来解决跨域问题
Nginx跨域实现 首先大家要搞清楚什么是跨域,为什么会有跨域情况的出现.哪些情况属于跨域? 跨域:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容 注:同源策略,单说来就是 ...
- miniFTP项目实战三
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- Django 模版语法 测试环境 ORM单表查询
模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...
- WPF 中的 button style 的修改
<Style x:Key="ButtonStyleTransBack" TargetType="Button"> <Setter Proper ...
- QT 自定义控件 以及信号和槽的使用
自定义login 控件 Login头文件 #ifndef LOGIN_H #define LOGIN_H #include <QWidget> namespace Ui { class L ...
- Commons-Collections(一)之list
Bag Bag继承自Collection接口,定义了一个集合,该集合会记录对象在集合中出现的次数. 假设你有一个包,包含{a, a, b, c}.调用getCount(a)方法将返回2,调用uniqu ...
- WPF 中的 经典的ModelView 通知页面更新 UI
view model ------------------------------------------------------------------------------ using HPCo ...
- Spark Core核心----RDD常用算子编程
1.RDD常用操作2.Transformations算子3.Actions算子4.SparkRDD案例实战 1.Transformations算子(lazy) 含义:create a new data ...
- css - 样式 - 可见性
visibility 可见性 取值:visible(可见) | hidden(隐藏.保留占位) 设置给:块.行内块.行内元素 作用:设置元素在文档上的可见性 此属性只是隐藏元素,但会为元素保留占位. ...