【C++ 实现广度优先搜索 队列】

1.广度优先搜索算法思想

设置某节点V1为初始节点,搜索该节点的未经过邻接节点(后要在标记经过)后,再次搜索该节点的未经过邻接节点(要标记经过),之后重复操作。注意所给的节点直接都可以连通起来(即:连通块>1),在以没有经过的节点为初始节点再次进行上述的广度搜索。  在所有的节点都标为经过后广度优先搜索结束。

2.实例展示:

题图.jpg

以A为初始节点:第一层:A,第二层:BFC,EFB,..(邻接节点的储存顺序不定,取决于实际代码写法,但存入顺序会决定搜索后续点的邻接节点的先后)

如为:EFB,则E->DC   F->NULL    B->NULL       序列:AEFBDC

2.队列使用

(1)队列:储存节点,实现广度优先搜索的搜索顺序

(2)实现说明:

设置初始节点,将其压入队列中,搜索队列储存首节点的未经邻接节点,在标记“经过”(保证后续压入队列中不会重复)后依次压入队列中,将当前首节点出队列(首节点已经搜索完毕,出队列,搜索下一个--也就是后续压入的“邻接节点”),后面就是重复操作。直至队列无元素(注意是否出现连通块>1)

3.节点邻接节点的储存

(1)数组

因未输入关系前,邻接节点个数未知,不妨使用vector动态数组,通过push_back()将邻接节点加入数组  a 尾部。

struct node
{
	vector<int> a;
};

4.寻找节点未经邻接节点

queue q;//队列
node* p=new node[vnum];
int* visited=new int[vnum];//记录顶点是否经过
int v1//当前节点
for(int i=0;i<p[v1].a.size();i++)
{
if(p[v1].a[i]==1&&visited[i]==0)
q.push_back(i);
}

4.注释:

(1)可以看出一次又一次压入的一系列节点是是一层一层的关系,初始节点是第一层,初始节点的邻接节点是由初始节点为中心向外发散的第二层,再次搜索这些邻接节点的邻接节点为第三层

(2)出队列的节点排序为广度优先搜索的搜索顺序

最后:文章主要是笔者自己,针对于自己当前所学到的知识做的笔记,可能有表述错误,说明不够简明易懂,自己也会慢慢在诸多方面进步。高兴对你学习有帮助,不喜请不要喷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值