BFS过程:

一:訪问顶点V,并标记V为已经訪问

二:顶点V入队列

三:假设队列非空。进行运行,否则算法结束

四:出队列取得对头顶点u,假设顶点未被訪问,就訪问该顶点,并标记该顶点为已经訪问

五:查找u的第一个邻接节点w

六:假设w不存在。则转到步骤三,否则循环运行

a. 假设w没有被訪问过。则先把w入队列

b.查找顶点u的下一个邻接节点,记为w,并转到步骤六

上图使用BFS訪问顺序为:

A BEDC

队列的变化步骤例如以下:

A

B

BE

ED

D

C

代码例如以下:

#include<iostream>
using namespace std;
#define VertexSize 10
int visit[VertexSize]; //===================================
#define QueueSize 30
typedef struct
{
int Seq[QueueSize];
int front;
int rear;
int count;
}RQueue; RQueue Q; void Initiate_Queue(RQueue *Q)
{
Q->front=0;
Q->rear=0;
Q->count=0;
} void AppendQueue(RQueue *Q,int data)
{
if(Q->count>=QueueSize)
{
cout<<"overflow"<<endl;
return ;
}
Q->Seq[Q->rear]=data;
Q->rear=(Q->rear+1)%QueueSize;
Q->count++;
} int QueueNotEmpty(RQueue *Q)
{
if(Q->count!=0)
return 1;
else
return 0;
} int DeleteQueue(RQueue *Q)
{
if(Q->count<=0)
{
cout<<"empty"<<endl;
return NULL;
}
int d;
d=Q->Seq[Q->front];
Q->front=(Q->front+1)%QueueSize;
Q->count--;
return d;
} //=================================== typedef struct
{
int weight[VertexSize][VertexSize];
}Graph; void Initiate_Graph(Graph *g,int n)
{
int i,j;
for(i=0;i<n;i++)
visit[i]=0;
for(j=0;j<n;j++)
{
if(i==j) g->weight[i][j]=0;
else g->weight[i][j]=0x7fff;
}
} void InsertEdge(Graph *g,int v,int w,int weight,int n)
{
if(v<0 || v>=n||w<0||w>=n)
{
cout<<"overflow!========="<<endl;
}
g->weight[v][w]=weight;
} void dfs(Graph *g,int u,int n)
{
cout<<u<<" ";
visit[u]=1;
int i;
for(i=0;i<n;i++)
{
if(g->weight[u][i]>0 && g->weight[u][i]<0x7fff && !visit[i])
{
visit[i]=1;
dfs(g,i,n);
}
}
} void bfs(Graph *g,int u,int n)
{
Initiate_Queue(&Q);
int j;
cout<<u<<" ";
visit[u]=1;
AppendQueue(&Q,u);
while(QueueNotEmpty(&Q))
{
int x=DeleteQueue(&Q);
for(j=0;j<n;j++)
{
if(g->weight[x][j]>0 &&g->weight[x][j]<0x7fff && !visit[j])
{
cout<<j<<" ";
visit[j]=1;
AppendQueue(&Q,j);
}
}
}
} void main()
{
Graph g;
int n,edge;
cout<<"请输入图的顶点个数:"<<endl;
cin>>n;
cout<<"请输入图的边个数"<<endl;
cin>>edge;
Initiate_Graph(&g,n);
int i,p1,p2,weight;
cout<<"请输入顶点-顶点-权值:"<<endl;
for(i=0;i<edge;i++)
{
cin>>p1>>p2>>weight;
InsertEdge(&g,p1,p2,weight,n);
}
cout<<"深度优先遍历为:"<<endl;
dfs(&g,0,n);
cout<<endl;
for(i=0;i<n;i++)
visit[i]=0;
cout<<"广度优先遍历为:"<<endl;
bfs(&g,0,n);
cout<<endl;
system("pause");
}

怎样实现广度优先遍历(BFS)的更多相关文章

  1. 广度优先遍历-BFS、深度优先遍历-DFS

    广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...

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

    广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不 ...

  3. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. 17.广度优先遍历bfs

    #include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...

  5. 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...

  6. 【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  7. 题目1457:非常可乐(广度优先遍历BFS)

    题目链接:http://ac.jobdu.com/problem.php?pid=1457 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  8. 图的广度优先遍历(bfs)

    广度优先遍历: 1.将起点s 放入队列Q(访问) 2.只要Q不为空,就循环执行下列处理 (1)从Q取出顶点u 进行访问(访问结束) (2)将与u 相邻的未访问顶点v 放入Q, 同时将d[v]更新为d[ ...

  9. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  10. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

随机推荐

  1. 25,Spark Sort-Based Shuffle内幕彻底解密

    一:为什么需要Sort-Based Shuffle? 1,  Shuffle一般包含两个阶段任务: 第一部分:产生Shuffle数据的阶段(Map阶段,额外补充,需要实现ShuffleManager中 ...

  2. 安装Team Services Agent Win7

    现状:项目现时使用的是Team Services,使用Team Services可以控制其中的一台Build Server,从Github提取代码,并在Build Server进入编译打包处理(son ...

  3. 一个LaTeX 中文文档的简单而实用的模板

    网上找的一个latex中文模板,感觉很简单,在我机器上有点小问题,完善记录一下. %要运行该模板,LaTex需要安装CJK库以支持汉字. %字体大小为12像素,文档类型为article %如果你要写论 ...

  4. 2017中南大学暑期集训day1 : debug&STL-A

    A - Surprising Strings 题意就是给你一个字符串,例如ZGBG,有一种称谓叫D-unique 这个字符串 在D=0时, 有三个子串 ZG GB BG,因为这三个都不同,也就是uni ...

  5. (寒假开黑gym)2018 USP Try-outs

    layout: post title: (寒假开黑gym)2018 USP Try-outs author: "luowentaoaa" catalog: true tags: m ...

  6. sql developer 自定义快捷键

  7. sed replace HEX sequence in your binary file:

    Here is how to replace a HEX sequence in your binary file: $ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x5 ...

  8. 【矩阵乘法】图中长度为k的路径的计数

    样例输入 4 2 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 样例输出 6 #include<cstdio> #include<vector> using ...

  9. 【数论】【筛法求素数】CODEVS 1462 素数和

    好吧……我不会欧拉筛也就罢了…… 傻逼筛法竟然这么长时间以来 一直RE ……源头竟然是 int 爆了. #include<cstdio> #include<algorithm> ...

  10. 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错

    拓扑排序,要让字典序最小,所以把栈改成堆. #include<cstdio> #include<queue> #include<algorithm> using n ...