C语言数据结构与算法之图的遍历(一)

我来给您详细讲解一下“C语言数据结构与算法之图的遍历(一)”的完整攻略。

简介

本篇攻略主要介绍了图的遍历问题。图是由若干个点和连接这些点的边构成的数据结构,常用来表示复杂的关系和网络。图的遍历就是从图的某一点开始,按照一定的规则沿着边逐个访问图中所有的点,不重不漏地遍历整个图。

在本篇攻略中,我们将探讨图的深度优先遍历(DFS)和广度优先遍历(BFS)两种常见的遍历方法。

图的深度优先遍历(DFS)

深度优先遍历(DFS)是一种先纵向再横向遍历的算法。具体来说,它从图的某一起始点出发,依次访问该节点的第一个相邻节点,再依次访问该节点的相邻节点的第一个未被访问的相邻节点,依次类推,直至遍历完所有与其连通的节点。如果某一个节点有多个未被访问的相邻节点,那么就任意选择其中的一个继续访问,直到所有节点被遍历完为止。

下面是一个简单的例子:

#include <stdio.h>

#define MAX_N 10

int visited[MAX_N]; // 标记数组
int graph[MAX_N][MAX_N] = {  // 定义一个无向图
    {0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
    {1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
    {1, 0, 0, 0, 0, 1, 1, 0, 0, 0},
    {0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
    {0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
    {0, 0, 1, 0, 0, 0, 0, 0, 1, 1},
    {0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
};

void DFS(int start, int n) {  // 深度优先遍历
    printf("%d ", start);
    visited[start] = 1;
    for (int i = 0; i < n; i++) {
        if (graph[start][i] == 1 && !visited[i]) {
            DFS(i, n);
        }
    }
}

int main() {
    int n = 10;
    for (int i = 0; i < n; i++) {
        visited[i] = 0; // 初始化标记数组
    }
    printf("DFS遍历结果:");
    DFS(0, n);
    printf("\n");
    return 0;
}

以上代码实现了一个由10个顶点组成的无向图的遍历,DFS算法的时间复杂度为$O(n+m)$,其中$n$和$m$分别表示图中的节点数和边数。

图的广度优先遍历(BFS)

广度优先遍历(BFS)是一种先横向再纵向遍历的算法。具体来说,它从图的某一起始点出发,先遍历其所有直接相邻的节点,依次访问它们的所有未被访问的相邻节点,直到全部遍历完为止。在遍历每一层节点时,BFS会按照从左到右的顺序进行访问,保证每一层节点的遍历顺序是相同的。

下面是一个简单的例子:

#include <stdio.h>

#define MAX_N 10

int visited[MAX_N]; // 标记数组
int graph[MAX_N][MAX_N] = {  // 定义一个无向图
    {0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
    {1, 0, 0, 1, 1, 0, 0, 0, 0, 0},
    {1, 0, 0, 0, 0, 1, 1, 0, 0, 0},
    {0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
    {0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
    {0, 0, 1, 0, 0, 0, 0, 0, 1, 1},
    {0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 1, 0, 0, 0, 0}
};

void BFS(int start, int n) {  // 广度优先遍历
    int queue[MAX_N], front = 0, rear = 0;  // 定义一个队列
    queue[rear++] = start;  // 初始节点入队
    while (front < rear) {
        int cur = queue[front++];
        printf("%d ", cur);  // 打印节点值
        visited[cur] = 1;
        for (int i = 0; i < n; i++) {
            if (graph[cur][i] == 1 && !visited[i]) {
                queue[rear++] = i;  // 相邻节点入队
            }
        }
    }
}

int main() {
    int n = 10;
    for (int i = 0; i < n; i++) {
        visited[i] = 0; // 初始化标记数组
    }
    printf("BFS遍历结果:");
    BFS(0, n);
    printf("\n");
    return 0;
}

以上代码同样实现了一个由10个顶点组成的无向图的遍历,BFS算法的时间复杂度同样为$O(n+m)$。

总结

通过本篇攻略的学习,我们了解了深度优先遍历和广度优先遍历两种常见的图遍历算法。DFS算法按照一定的规律逐个遍历各个节点,遍历的顺序更倾向于纵向;BFS算法则是先遍历某一层所有节点,再遍历下一层所有节点,遍历的顺序更倾向于横向。在实际应用中,我们需要根据自己的需求选择合适的算法。

希望这篇攻略能对您有所帮助,谢谢!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构与算法之图的遍历(一) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 【华为OD机试 2023】专栏介绍 +华为OD机试介绍+ 真题目录【转载】

    华为题库说明 2022与2023题库的区别 华为OD机试的题库是季度更新的(Q1\Q2\Q3\Q4)。笔者专栏的题库分为2023和2022。 2023的题库是包括2022.11(Q4第四季度)之后以及2023年的题库。 2022的题库是包括2022.11(Q4第四季度)之前题库。 支持的语言 目前大部分题 使用C++ Java JavaScript 以及py…

    算法与数据结构 2023年4月17日
    00
  • C#数据结构与算法揭秘三 链表

    作为一本通俗易懂的C#数据结构与算法书籍,其第三章主要介绍链表(Linked List)的概念和基本操作。下面是链表的基本概念: 链表(Linked List)是一种动态数据结构,其中的元素按线性顺序排列,并且每个元素都称为一个结点(Node)。 每个结点都包含一个元素和一个指向下一个结点的指针(Pointer)。 相比于数组,链表的优势在于能够轻松地增加或…

    数据结构 2023年5月17日
    00
  • MySQL索引详解及演进过程及面试题延伸

    MySQL索引详解及演进过程及面试题延伸 索引的作用 在 MySQL 中,索引是一种数据结构,可用于快速查找和访问表中的数据。使用索引可以大大提高查询效率,特别是在大型数据表中。 索引可以看作是一本书中的目录,目录中列出了每个章节的页码,通过查询目录,读者可以快速找到感兴趣的章节。 索引的种类 MySQL 中支持多种类型的索引,下面我们介绍一下常见的索引类型…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之递归

    带你了解Java数据结构和算法之递归 什么是递归? 递归是一种算法或计算机程序的设计方法,在程序执行过程中直接或间接的调用自身。 递归的实现方式 递归的实现通常使用函数进行的。在函数中,我们首先检查停止条件(递归基)是否满足,如果满足,我们停止递归;否则,我们调用自身递归进行下一步计算。 递归的应用场景 递归通常在解决问题中使用。对于像树、图等复杂结构的遍历…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • 四边形不等式学习笔记

    简要题意 四边形不等式是一种 dp 优化策略。多用于 2D DP。 内容 对于区间 \([l,r]\) 带来的贡献 \(w(l,r)\),如果其满足: 对于 \(L\leq l\leq r \leq R\),\(w(L,r)+w(l,R)\leq w(L,R)+w(l,r)\) 则称 \(w\) 满足四边形不等式。特别地,如果上式符号取等,则称其满足四边形恒…

    算法与数据结构 2023年4月17日
    00
  • 李航统计学习概述

    监督学习 感知机 概念: 感知机模型的基本形式是: \(f(x) = sign(w \cdot x + b)\) 其中,\(x\) 是输入样本的特征向量,\(w\) 是权值向量,\(b\) 是偏置量,\(w \cdot x\) 表示向量 \(w\) 和 \(x\) 的点积。\(sign\) 函数表示符号函数,当输入大于 0 时输出 1,否则输出 -1。 要求…

    算法与数据结构 2023年4月25日
    00
  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java Concurrency集合之LinkedBlockingDeque_动力节点Java学院整理 LinkedBlockingDeque是什么? LinkedBlockingDeque是java.util.concurrent包下一个双向阻塞队列,用于在多线程的环境中处理元素序列,它支持在队列两端添加和移除元素。LinkedBlockingDeque可…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部