第11周 【项目3 - 图遍历算法实现】
发布日期:2021-05-24 13:03:20 浏览次数:20 分类:精选文章

本文共 2187 字,大约阅读时间需要 7 分钟。

深度优先遍历(DFS)和广度优先遍历(BFS)是图遍历算法中的两种重要方法。这些算法在程序设计中常用于查找图中的路径、连通区域或识别图的各种属性。以下是关于这两种算法的详细说明。

深度优先遍历(DFS)

DFS是一种以栈数据结构为基础的遍历算法。与BFS(队列)不同,DFS会尽可能深入递归遍历每一个可达的节点。其核心思想是:进入节点后,尽可能深入访问该节点的子节点,而不是访问顺序上的下一个节点。

代码示例解析

void DFS(ALGraph *G, int v) {    ArcNode *p;    int w;    visited[v] = 1;    printf("%d ", v);    p = G->adjlist[v].firstarc;    while (p != NULL) {        w = p->adjvex;        if (visited[w] == 0)            DFS(G, w);        p = p->nextarc;    }}
  • 代码主要包含几个部分:

    • visited[v] = 1:标记节点v已访问。
    • printf("%d ", v):输出当前访问的节点编号。
    • p = G->adjlist[v].firstarc:从当前节点v获得其第一个邻接点p
    • while (p != NULL):循环处理邻接点,如果p_NULL则退出循环。
      • w = p->adjvex:获取邻接点p的节点编号w
      • if (visited[w] == 0):检查节点w是否已访问。
        • 如果未访问,则调用DFS(G, w)继续深度遍历。
      • p = p->nextarc:获取邻接点p的下一个邻接点。
  • 主函数main()中:

    • 初始化图G
    • 使用测试图从数组A构建图的邻接表。
    • 调用DFS(G, 0)进行从节点0开始的深度优先遍历。
    • 快速查看完整代码点击查看
  • 测试图示

    测试使用的图结构如下:

    1 <-> 2 <-> 3|      |      |8 <-> 4 <-> 5|      |6 <-> 7

    优势:

    • DFS能够在图中找到哈密尔顿路径或环。
    • 适合处理树和� Trails结构。
    • 适用于需要预先知道深度信息的场景。

    广度优先遍历(BFS)

    BFS是一种以队列数据结构为基础的遍历算法。其核心思想是:从起点出发,一层一层地访问邻接节点,确保每一层的节点都被访问过后才访问下一层。这与 DFS 的区别在于,BFS更注重访问节点的层数。

    代码示例解析

    void BFS(ALGraph *G, int v) {    ArcNode *p;    int w, i;    etext int queue[MAXV], front = 0, rear = 0;    int visited[MAXV];        for (i = 0; i < G->n; i++) {        visited[i] = 0;    }        printf("%2d", v);    visited[v] = 1;    rear = (rear + 1) % MAXV;    queue[rear] = v;        while (front != rear) {        front = (front + 1) % MAXV;        w = queue[front];        p = G->adjlist[w].firstarc;                while (p != NULL) {            if (visited[p->adjvex] == 0) {                printf("%2d", p->adjvex);                visited[p->adjvex] = 1;                rear = (rear + 1) % MAXV;                queue[rear] = p->adjvex;            }            p = p->nextarc;        }    }    printf("\n");}
  • 代码主要包含几个部分:

    • visited[MAXV]:存储节点访问标记。
    • 队列初始化:使用循环队列结构,避免越界错误。
    • frontrear:队列的前置和后置指针。
    • 从起点v开始,依次访问所有可达节点。
  • 主函数main()中:

    • 构建图的邻接表。
    • 调用BFS(G, 2)从节点2开始广度遍历。
    • 调用BFS(G, 0)从节点0开始广度遍历。
    • 快速查看完整代码点击查看
  • 测试图示

    与DFS相同,测试图结构如下:

    1 <-> 2 <-> 3|      |      |8 <-> 4 <-> 5|      |6 <-> 7

    优势:

    • BFS能够找到图的最短路径。
    • 适合处理网格或层级结构的图。
    • 适用于需要访问顺序不影响结果的场景,比如任务调度。

    总结

    两种遍历算法各有优势:

    • DFS:适合预先知道深度信息的场景,能够找到哈密尔顿路径。
    • BFS:擅长找到最短路径,适合网格和层级结构。

    通过合理选择算法,可以更好地解决实际问题。

    上一篇:第11周 【项目4 - 利用遍历思想求解图问题】
    下一篇:第11周 项目2 - 操作用邻接表存储的图】

    发表评论

    最新留言

    第一次来,支持一个
    [***.219.124.196]2025年04月24日 04时08分41秒