若用邻接矩阵表示图,得到的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; };