深度优先和广度优先遍历的算法

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的下一个邻接点
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值