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

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;
}

猜你喜欢

转载自blog.csdn.net/u011370813/article/details/80413472