1、DFS(Depth-First-Search深度优先搜索)
从选定的顶点开始,开始递归遍历。递归的思想:标记起点,找到第一个邻接点,如果该点没标记,那么以该点为新起点进行递归。如果改点标记或者上一个邻接点递归完毕,寻找下一个邻接点重复上面过程。算法如下:
void dfs(int start, int label[])
{
label[start] = 1; // 标记该点
int u = findOne(start); // 找到start的一个邻接点
while(u != -1) // 当邻接点存在时
{
if(label[u] == 0) // 当该邻接点未被标记时
dfs(u, label); // 递归该点
u = findNext(start); // 找到下一个邻接点
}
}
// findNext() findOne()根据不同的存储结构实现方法不同。
// label[] 数组使用前需要初始化为0
2、BFS(Breadth-First-Search广度优先搜索)
需要使用到队列Queue。思想是:将指定起点加入队列,然后对队列进行循环判断,判断队列不为空。在循环内,从队列内删除一个并记录这个元素(点),找这个点的所有邻接点,将没被标记的邻接点依次加入队列,并标记加入队列的点。重复循环。之所以在加入队列的时候进行标记判断和标记,是因为当多个点有同一个邻接点时,该邻接点会被添加多次,可能会陷入死循环。
void bfs(int start, int label[])
{
Queue *q = initQueue(); // 建议使用链表实现的队列
q.add(start);
while(!q.isEmpty()) // 队列不空
{
int v = q.del(); // 将删除的元素赋值给v
int u = findOne(v); // 找v的邻接点
while(u != -1) // 邻接点存在
{
if(label[u] == 0) // 未标记
{
label[u] == 1; // 标记
q.add(u); // 入队列
}
u = findNext(v); // 找下一个邻接点
}
}
freeQueue(q);
}