算法-图(6)广度优先遍历图

若用邻接矩阵表示图,得到的BFS序列是唯一的。若用邻接表表示则不唯一。

广度优先搜索

逐层遍历,图中有多少顶点就要重复多少步,每一步算法都有一个当前顶点,最初的当前顶点为指定的起始顶点,先访问当前顶点,再依次访问其所有还没访问过的邻接顶点,设置访问过的顶点设置访问标志为visit[v]=true

每个顶点进队列仅一次,因此while循环最多执行n次

1若用邻接表表示图

总循环时间代价为各结点度的和O(e),总的时间代价为O(n+e)

2若用邻接矩阵表示图

对于每一个被访问的结点,循环要检测矩阵中n个元素,总时间代价为O(n2)

template <class T,class E>
void BFS(Graph<T,E>& G,const T& v){
    int i,w,n=G.NumberOfVerticles();
    for (i=0; i<n; i++) visit[i]=false;
    int loc=G.getVertexPos(v);
    count<<G.getValue(loc)<<'';
    visited[loc]=true;
    //  不是递归过程,使用队列记忆正在访问的这一层和上一层的结点
    Queue<int> Q;
    Q.EnQueue(loc);
    while(!Q.IsEmpty){
        Q.DeQueue(loc);  //注意,队列里的结点已经visit过了,所以出队列后只要把邻接结点进队列即可
        w=getFirstNeighbour(loc);
        while(w!=-1){
            if(visited[w]==false){
                cout<<G.getValue(w)<<'';
                visited[w]=true;   //进队列前先visit
                Q.EnQueue(w);
            }
            w=G.getNextNeighbour(loc,w);
        }
    }
    delete []visited;
};

 

转载于:https://www.cnblogs.com/yangyuliufeng/p/9301622.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值