1.广度优先搜索算法思想
设置某节点V1为初始节点,搜索该节点的未经过邻接节点(后要在标记经过)后,再次搜索该节点的未经过邻接节点(要标记经过),之后重复操作。注意所给的节点直接都可以连通起来(即:连通块>1),在以没有经过的节点为初始节点再次进行上述的广度搜索。 在所有的节点都标为经过后广度优先搜索结束。
2.实例展示:
以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)出队列的节点排序为广度优先搜索的搜索顺序
最后:文章主要是笔者自己,针对于自己当前所学到的知识做的笔记,可能有表述错误,说明不够简明易懂,自己也会慢慢在诸多方面进步。高兴对你学习有帮助,不喜请不要喷。