欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图的深度优先遍历和广度优先遍历

程序员文章站 2022-05-21 19:28:17
...

BFS

思路

  1. 广度优先遍历中从一个节点出发,例如1,先找到其邻接至的节点,如2,3,4
  2. 然后依次把2,3,4放入队列,再从队列中依次取出每一个节点,找到其邻接至的节点插入到队列尾部
  3. 最终当队列中元素为空时就找到了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;
}