1.深度优先
深度优先遍历v0所在的连通子图
void DepthFirstSearch(Graph graph, int v0)
{
visit(0);
visited[v0] = TRUE;
w = FirstAdjvertex(g, v0);
while (w != -1) {
if (!visited[w])
DepthFirstSearch(g, w);
w = NextAdjVertex(g, v0, w);
}
}
采用邻接矩阵的DepthFirstSearch
void DepthFirstSearch(AdjMatrix g, int v0)
{
visit(v0); // 访问当前节点v0
visited[v0] = True; // 将当前节点v0标记为已访问
for (int vj = 0; vj < g.vexnum; vj++) {
// 遍历图中所有节点,vj表示当前遍历到的节点
if (!visited[vj] && g.arcs[v0][vj].adj == 1) {
// 如果节点vj未被访问且v0与vj之间有边(邻接关系为1)
DepthFirstSearch(g, vj); // 递归调用深度优先搜索函数,从节点vj开始继续深度遍历
}
}
}
采用邻接表的深度优先遍历
void DepthFirstSearch(AdjMatrix g, int v0)
{
visit(v0); // 访问顶点v0,visit函数可能是一个用来处理顶点的操作,比如打印顶点值
visited[v0] = True; // 将顶点v0标记为已访问,通常用一个布尔数组visited来记录顶点的访问状态
p = g.vertex[v0].firstarc; // 获取顶点v0的第一个邻接点,这里使用了邻接矩阵的表示方法
while (p != NULL)
{
if (!visited[p->adjvex]) // 如果邻接点未被访问过
{
DepthFirstSearch(g, p->adjvex); // 递归调用DFS,以当前邻接点为起点进行深度优先搜索
}
p = p->nextarc; // 继续访问v0的下一个邻接点
}
}
非递归形式的深度优先搜索
void DepthFirstSearch(Graph g, int v0)
{
initStack(&S); // 初始化一个栈S,用来辅助实现DFS算法
Push(&S, v0); // 将起始顶点v0入栈
while (!IsEmpty(S)) // 当栈不为空时,继续执行DFS算法
{
Pop(&S, &v); // 从栈中取出一个顶点v
if (!visited[v]) // 如果顶点v未被访问过
{
visit(v); // 访问顶点v
visited[v] = True; // 将顶点v标记为已访问
w = FirstAdjVertex(g, v); // 获取顶点v的第一个邻接点,FirstAdjVertex函数可能用来找到顶点v的第一个邻接点
while (w != -1) // 当顶点v还有未访问的邻接点时
{
if (!visited[w]) // 如果邻接点w未被访问过
Push(&S, w); // 将邻接点w入栈
w = NextAdjVertex(g, v, w); // 找到顶点v的下一个邻接点,NextAdjVertex函数可能用来找到v相对于w的下一个邻接点
}
}
}
}
2.广度优先搜素
广度优先搜素图g中v0所在的连通子图
void BreadthFirstSearch(Graph g, int v0)
{
visit(v0); // 访问顶点v0,visit函数可能是一个用来处理顶点的操作,比如打印顶点值
visited[v0] = True; // 将顶点v0标记为已访问,通常使用一个布尔数组visited来记录顶点的访问状态
initQueue(&Q); // 初始化一个队列Q,用来辅助实现BFS算法
EnterQueue(&Q, v0); // 将起始顶点v0入队
while (!Empty(Q)) // 当队列不为空时,继续执行BFS算法
{
DeleteQueue(&Q, &v); // 从队列中取出一个顶点v
w = FirstAdjVertex(g, v); // 获取顶点v的第一个邻接点,FirstAdjVertex函数可能用来找到顶点v的第一个邻接点
while (w != -1) // 当顶点v还有未访问的邻接点时
{
if (!visited[w]) // 如果邻接点w未被访问过
{
visit[w]; // 访问邻接点w
visited[w] = True; // 将邻接点w标记为已访问
EnterQueue(&Q, w); // 将邻接点w入队
}
w = NextAdjVertex(g, v, w); // 找到顶点v的下一个邻接点,NextAdjVertex函数可能用来找到v相对于w的下一个邻接点
}
}
}