图的深度优先遍历和广度优先遍历

2023-11-11

1.深度优先遍历(DFS)

(1)从某个顶点V出发,访问顶点并标记为已访问

(2)访问V的其中一个邻接点(通常最左边的那个),如果没有访问过,访问该顶点并标记为已访问,然后再访问该顶点的邻接点,递归执行

   先一直往后走,如果该顶点已访问过,退回上一个顶点,再检查该顶点的邻接点是否都被访问过,如果有没有访问过的继续向下访问,如果全部都访问过继续退回到上一个顶点,继续同样的步骤。

 

深度优先遍历类似于树的先序遍历,深度优先遍历算法结果不唯一。

选择V1为出发点,访问V1,然后访问V1的邻接点,邻接点有V2 V3和V4,假设都从左边的邻接点开始访问

访问V1的最左边的邻接点V2,访问V2的邻接点V5

访问V5的邻接点V3,V3的左边邻接点是V1,V1已经访问过,所以访问V4

V4的左边邻接点V6,访问V6,V6的所有邻接点都已访问过,退回V4,V4的所有邻接点也都访问过退回V3,V3的邻接点全部访问过退回V5,

V5的邻接点全部访问过退回V2,V2的邻接点全部访问过退回到出发点V1,V1的全部邻接点访问过,遍历结束。

遍历序列为V1→V2→V5→V3→V4→V6

2.广度优先遍历(BFS)

(1)从某个顶点V出发,访问该顶点的所有邻接点V1,V2..VN

(2)从邻接点V1,V2...VN出发,再访问他们各自的所有邻接点

(3)重复上述步骤,直到所有的顶点都被访问过

(1)从顶点V1出发,v1入队,访问V1,V1的邻接点有V2     V3     V4,将它们入队,v1出队

队列:V2   V3  V4

(2)访问队头V2,V2的邻接点为V1(已访问过,忽略)和V5,将V5入队,V2出队

队列:V3  V4  V5

(3)访问V3,V3的邻接点为V1(访问过忽略)   V4(已在队列忽略)  V6   V5(已在队列,忽略),V6入队,V3出队

队列:V4 V5  V6

/* 邻接矩阵的广度遍历算法 */
void BFSTraverse(MGraph G)
{
    int i, j;
    Queue Q;
    for(i = 0; i < G.numVertexes; i++)
           visited[i] = FALSE;
        InitQueue(&Q);        /* 初始化一辅助用的队列 */
        for(i = 0; i < G.numVertexes; i++)  /* 对每一个顶点做循环 */
        {
        if (!visited[i])    /* 若是未访问过就处理 */
        {
            visited[i]=TRUE;        /* 设置当前顶点访问过 */
            printf("%c ", G.vexs[i]);/* 打印顶点,也可以其它操作 */
            EnQueue(&Q,i);        /* 将此顶点入队列 */
            while(!QueueEmpty(Q))    /* 若当前队列不为空 */
            {
                DeQueue(&Q,&i);    /* 将队对元素出队列,赋值给i */
                for(j=0;j<G.numVertexes;j++) 
                { 
                    /* 判断其它顶点若与当前顶点存在边且未访问过  */
                    if(G.arc[i][j] == 1 && !visited[j]) 
                    { 
                         visited[j]=TRUE;            /* 将找到的此顶点标记为已访问 */
                        printf("%c ", G.vexs[j]);    /* 打印顶点 */
                        EnQueue(&Q,j);                /* 将找到的此顶点入队列  */
                    } 
                } 
            }
        }
    }
}

https://blog.csdn.net/lom9357bye/article/details/46604657

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的深度优先遍历和广度优先遍历 的相关文章

  • 若干经典基础算法题目练习

    练习1 判断是否为素数 ConsoleAppIsPrime1 cpp 定义控制台应用程序的入口点 函数功能 判断一个输入的数是否为素数 函数原形 bool Prime int x 参数 int x 将要判断的数 返回值 bool型变量 判断
  • 算法导论 第三节 分治法

    分治法 1 分 把一个大问题分成若干个小问题 即原问题的n变小 2 治 递归的解决每一个子问题 然后把这些子问题的解合并成整个大问题的解 归并排序 1 一分为二 2 递归的对每一个子数组进行排序 3 合并 线性的n时间内就可以完成 归并排序
  • 最大子数组问题

    最大子数组问题 本文只是做一个记录 更细致的思路请查看算法导论 最大子数组结构体 typedef struct int low high sum SubArray 暴力求解 计算所有的数组区间的和进而得到最大的子数组 算法复杂度为 n 这种
  • 从0开始的算法大师(贰)

    从0开始的算法大师 标签 空格分隔 算法导论 常言道 算导 是本看不下去的好书 第二部分 排序和顺序统计量 数据结构 已经学过排序内容 第6章 堆排序 用数组A表示堆 根节点为A 1 A 0 代表A heap size 属性 说明 A le
  • 二分搜索树

    经典写法 内心os 就是有点繁琐hh include
  • ​LeetCode刷题实战214:最短回文串

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 最短回文串 我们先来看题面 h
  • 写一个个人认为比较详细的adaboost算法

    最近在看机器学习中adaboost adaptive boostint 算法部分的内容 在csdn上面查找一番发现 好像没有讲的特别的详尽的 当然可能是我人品不佳 所以没有找到 为了防止同样的事情发生在其他人的身上 所以就写了这篇博文 尽量
  • 『数据结构』B树(B-Tree)及其变体 B+树,B*树

    原文地址 1 背景 当有大量数据储存在磁盘时 如数据库的查找 插入 删除等操作的实现 如果要读取或者写入 磁盘的寻道 旋转时间很长 远大于在 内存中的读取 写入时间 平时用的二叉排序树搜索元素的时间复杂度虽然是 O log2n O l o
  • NlogN复杂度寻找数组中两个数字和等于给定值

    算法导论 22页2 3 7 描述一个运行时间为O nlogn 的算法 找出n个元素的S数组中是否存在两个元素相加等于给定x值 AC解 a 1 3 6 7 9 15 29 def find2sumx nums x nums sort le r
  • 《算法导论》常见算法总结

    前言 本篇文章总结中用到很多其他博客内容 本来想附上原作链接 但很久了未找到 这里关于原创性均来源于原作者 分治法 分治策略的思想 顾名思义 分治是将一个原始问题分解成多个子问题 而子问题的形式和原问题一样 只是规模更小而已 通过子问题的求
  • 图的深度优先遍历和广度优先遍历

    1 深度优先遍历 DFS 1 从某个顶点V出发 访问顶点并标记为已访问 2 访问V的其中一个邻接点 通常最左边的那个 如果没有访问过 访问该顶点并标记为已访问 然后再访问该顶点的邻接点 递归执行 先一直往后走 如果该顶点已访问过 退回上一个
  • 算法导论——分治法、归并排序——伪代码和Java实现

    第二章第三节 分治法 我们首先先介绍分治法 分治法的思想 将原问题分解为几个规模较小但类似于原问题的子问题 递归地求解这些子问题 然后在合并这些子问题的解来解决原问题的解 还是拿扑克牌举例子 假设桌上有两堆牌面朝上的牌 牌面朝上 有值 每堆
  • ​LeetCode刷题实战26:删除排序数组中的重复项

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 删除排序数组中的重复项 我们先
  • 计数排序--时间复杂度为线性的排序算法

    我们知道基于比较的排序算法的最好的情况的时间复杂度是O nlgn 然而存在一种神奇的排序算法 不是基于比较的 而是空间换时间 使得时间复杂度能够达到线性O n k 这种算法就是本文将要介绍的计数排序 一 适用情况 这个算法在n个输入元素中每
  • 算法导论 练习 2.2

    2 2 1 答案 n theta n 渐进符号的定义会在第三章里明确给出 所以这里就不写证明了 详细证明见第三章习题 好多好多啊 2 2 2 选择排序 数据结构课程基本排序算法之一 代码 SELECTION SORT A n length
  • 红黑树(算法导论版)

    1 定义 1 每个节点是红色或者黑色的 2 根节点是黑色的 3 所有叶子结点 NIL 都是黑色的 4 如果一个节点是红色 则它的两个子节点都是黑色的 5 对每个节点 从该节点到其所有后代叶节点的简单路径上 均包含相同数目的黑色节点 2 性质
  • 【分治算法】-1.金块问题:递归和分治策略

    例14 2 金块问题 有一个老板有一袋金块 每个月将有两名雇员会因其优异的表现分别被奖励一个金块 按规矩 排名第一的雇员将得到袋中最重的金块 排名第二的雇员将得到袋中最轻的金块 根据这种方式 除非有新的金块加入袋中 否则第一名雇员所得到的金
  • 算法导论三-分治法

    分治法 简单说 分治法即分而治之 即将问题分化为小问题来处理 简化起来看有二到三个步骤 分 将问题分解为若干子问题 复杂度n降低 治 递归解决子问题 合 合并子问题的解 常见分治法的递归式为 T n 2T n 2 n 即分为两个解法一样的子
  • 分治法 ( Divide And Conquer ) 详解

    文章目录 引言 分治法的范式 递归式 求解递归式的三种方法 代入法 递归树法 主方法 引言 在这篇 blog 中 我首先会介绍一下分治法的范式 接着给出它的递归式通式 最后我会介绍三种方法 代入法 递归树 和主方法 求解递归式 分治法的范式
  • 最常用的五大算法

    一 贪心算法 贪心算法 又称贪婪算法 是指 在对问题求解时 总是做出在当前看来是最好的选择 也就是说 不从整体最优上加以考虑 他所做出的仅是在某种意义上的局部最优解 贪心算法不是对所有问题都能得到整体最优解 但对范围相当广泛的许多问题他能产

随机推荐