图的深度优先遍历和广度优先遍历
程序员文章站
2022-05-21 19:28:17
...
BFS
思路
- 广度优先遍历中从一个节点出发,例如1,先找到其邻接至的节点,如2,3,4
- 然后依次把2,3,4放入队列,再从队列中依次取出每一个节点,找到其邻接至的节点插入到队列尾部
-
最终当队列中元素为空时就找到了1可以到达的所有路径
代码:
virtual void bfs(int v,int reach[],int label)//所有图的表示方法都可以直接用的广度优先搜索方法
{
//v表示起始的点,reach标记所有遍历过的点对应的reach[x]=label;
queue<int>q(10);//创建一个队列来存储遍历到的节点,作为辅助
reach[v]=label;
q.push(v);
while(!q.empty())
{
int w=q.front();
q.pop();
vertexIterator<T>*iw=Iterator(v);//当前节点的一个迭代器
int u;
while((u=iw->next())!=0)
{
if(reach[u]==0)
{
q.push(u);
reach[u]=label;
}
}
delete iw;
}
}
邻接矩阵表示图时的广度优先搜索方法
void bfs(int v,int reach[],int label)
{
queue<int>q(10);
reach[v]=label;
q.push(v);
while(q.empty()==false)
{
int u=q.front();
q.pop();
for(int w=1;w<=n;w++)
{
if(a[u][w])!=noEdge&&reach[w]==0)
q.push(w);
reach[w]=label;
}
}
}
邻接链表时候改为:
for(chainNode<int>*w=alist[u].firstNode;w!=NuLL;w=w->next)
{
if(w->element!=0)
{
q.push(w->element);
reach[w->element]=label;
}
}
深度优先搜索采用递归的方法:
void rDfs(int v,int reach[],int label)
{
reach[v]=label;
vertexIterator<T>*iw=Iterator(v);
int u;
while((u=iw->next)!=0)
{
if(reach[u]==0)
rDfs(u);
}
delete iw;
}
下一篇: 广度和深度优先遍历