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

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值