算法-图(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;
};

猜你喜欢

转载自www.cnblogs.com/yangyuliufeng/p/9301622.html