1、深度优先搜索(Depth FirstSearch)
访问方式类似于树的前序遍历,它可以用递归方式定义如下:
(1)选中第一个被访问的顶点;
(2)对这个顶点作已访问过的标志;
(3)依次从顶点的未被访问过的第1,2,3,……,个邻接顶点出发,对他们进行深度优先搜索;
(4)如果还有顶点未被访问,则选中一个起始顶点,转向(2);
(5)所有的顶点都被访问到,则结束。
要注意,有时候我们无法从一个顶点出发访问其他所有顶点。
另外,还需要额外的方法来判断某个顶点是不是已经被访问过了。
伪代码如下:
void DFS(图){
for(图的所有顶点){
若该顶点未被访问{
dfs(该顶点);
}
}
}
上面的dfs(某个顶点)指的是从某个顶点开始进行深度优先搜索,有2种实现方式:
递归实现:
dfs(某个顶点)
{
访问这个顶点;//可以cout打印,也可以储存在一个vector中
将这个顶点标记为已访问;
遍历这个节点的所有邻接节点
{
记某个邻接顶点为p;
若(p没被访问过) dfs(p);
}
}
栈实现:
栈实现其实跟前面的递归实现是类似的。
dfs(某个顶点)
{
初始化一个栈,并将这个顶点入栈;
While(栈非空)
{
访问栈顶顶点(记为p);//可以cout打印,也可以储存在一个vector中
在全局数组中将这个顶点标记为已访问;
将栈顶顶点出栈;
遍历p的所有邻接顶点
{
若该顶点没被访问过,入栈;
}
}
}
2、广度优先搜索(BFS)广度优先搜索(BreadthFirst Search)类似于树从根结点出发的层次遍历。访问方式如下:
(1)选中第一个被访问的顶点;
(2)对顶点作已访问过的标志;
(3)依次访问已访问顶点的第1,2,……个未被访问过的邻接顶点,并进行标记;转向(3);
(4)如果还有顶点未被访问,则选中一个起始顶点,转向(2);
(5)所有顶点都被访问到,则结束。
广度优先搜索一般是用队列实现的。同前面一样,也需要方法来表示某个顶点有没有被访问过。广度优先搜索的伪代码如下:
void BFS(图)
{
for(所有顶点)
{
若该顶点未被访问
{
bfs(该顶点);
}
}
}
bfs(某个顶点)指的是从某个顶点开始进行广度优先搜索遍历。
bfs(某个顶点)
{
初始化一个队列queue并将这个顶点放入队列;
while(queue不为空)
{
访问队头顶点s;//可以cout打印,也可以储存在一个vector中
标记s为已遍历;
出队pop_front();
遍历p的所有邻接顶点
{
若该顶点没被访问过,入队;
}
}
}