广度优先搜索以源结点s为出发点,算法始终将已发现和未发现结点之间的边界,沿其广度方向向外扩展。也即算法需要在发现所有距离源结点s为k的所有结点之后才会去发现距离源结点距离为k+1的其他结点。
talk is cheap,show me the code!上具体的代码,最容易解释这一切。
该例子是以无向图为基础,代码中注释有具体说明,不在解释每一步:
#include <iostream>
#include <list>
#include <queue>
using namespace std; //无向图
class Graph{
private:
int v;//图的节点数
list<int> *adj;//指向包含临接链表的数组
public:
Graph(int v);
void addEdge(int start,int end);//添加临接边
void BFS(int s);//广度优先搜索
}; Graph::Graph(int v){
this->v = v;
adj = new list<int>[v];
} //无向图中添加一条边在临接表中添加两项
void Graph::addEdge(int start,int end){
adj[start].push_back(end);
adj[end].push_back(start);
} void Graph::BFS(int s){
//先标记所有结点都未被访问
bool* visited = new bool[v];
for (int i=;i<v;i++)
visited[i] = false;
//创建队列
queue<int> q = queue<int>();
//先设置源结点
visited[s] = true;
q.push(s); while(!q.empty()){
int node = q.front();
cout<<node<<" ";
q.pop();
//node结点的临接表
list<int> nlist = adj[node];
list<int>::iterator beg = nlist.begin();
for (;beg != nlist.end();beg++){
if (!visited[*beg]){
visited[*beg] = true;
q.push(*beg);
}
}
}
cout<<"\n";
} int main(){
Graph g = Graph();
g.addEdge(,);
g.addEdge(,);
g.addEdge(,);
g.addEdge(,);
g.addEdge(,);
g.addEdge(,);
g.addEdge(,);
g.addEdge(,);
g.BFS(); return ;
}
该例子中每个结点就是用一个整数表示,更复杂点的话,每个结点可以组织成一个node结构体,可以给每个node结点添加距离属性等。
运行结果如下 示:
文献引用:算法导论->22章->基本图算法
代码参考:http://www.geeksforgeeks.org/breadth-first-traversal-for-a-graph/