数据结构——图的两种遍历方法

2023-11-16

遍历定义:从已给的图中某一顶点出发,沿着一些边,访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历。

遍历实质:找每个顶点的邻接点的过程。

图的特点:图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经         访问过的顶点。

解决思路:可设置一个辅助数组 visited [n ],用来标记每个被访问过的顶点。它的初始状态为0,在图的遍历过程中,一旦某一         个顶点i被访问,就立即改 visited [i]为1,防止它被多次访问。

图常用的遍历: 深度优先搜索
                          广度优先搜索

图的深度优先遍历(Depth_First Search:DFS):

遍历步骤:从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有         路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起始点,重复上述过程,直         至图中所有顶点都被访问到为止。

详细归纳:

  • 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1;

  • 再从 w1出发,访问与 w1邻接但还未被访问过的顶点 w2;

  • 然后再从 w2 出发,进行类似的访问, …

  • 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。

  • 接着,退回一步, 退到前一次刚访问过的顶点,看是否还有其它未被访问的邻接顶点。
    如果有, 则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;
    如果没有, 就再退回一步进行搜索。重复上述过程,直到连通图中所有顶
    点都被访问过为止。

如图所示,例1:

具体实现过程,例2:

深度优先遍历编程算法:(邻接矩阵)

void DFS( Mgraph g,int v,int visited[])
{
    /* 邻接矩阵存储,从顶点v出发,对图g进行深度优先搜索*/
    int j;
    printf("%d ",g.vexs[v]);
    visited[v]=1; /*标识v被访问过*/
    for(j=0;j<g.vexnum;j++); /* */
    {
        if( g.arcs[v][j]==1&&visited[j]==0)/*j为v的邻接点,未被访问过*/
        DFS(g,j,visited); /*从j出发递归调用DFS*/
    }/*for*/
}/*DFS*/

void DFSTraverse(Mgraph g)
{ 
    /*邻接矩阵 深度优先搜索*/
    int v;
    int visited[MAX_VERTEX_NUM];
    for(v=0;v<g.vexnum;v++)
    visited[v]=0; /*初始化visited数组*/
    for(v=0;v<g.vexnum;v++)
        if(visited[v]==0) 
            DFS(g,v,visited);
    /*从未被访问过的v出发, DFS搜索*/
}

深度优先遍历编程算法:(邻接表)

void DFS(ALGraph g,int v,int visited[])
{
    /*从顶点v出发,对图g进行深度优先搜索*/
    ArcNode *p;
    int w;
    printf("%d ",g.adjlist[v].data);
    visited[v]=1; /*标识v被访问过*/
    p=g.adjlist[v].firstarc; /*p指向第v个单链表的头指针*/
    while(p)
    {
        w=p->adjvex; /*w为v的邻接点*/
        if(visited[w]==0) /*若w未被访问*/
            DFS(g,w,visited); /*从w出发递归调用DFS*/
        p=p->nextarc; /*找v的下一个邻接点*/
    }/*while*/
}/*DFS*/

void DFSTraverse(ALGraph g)
{ 
    /*邻接表 深度优先搜索*/
    int v;
    int visited[MAX_VERTEX_NUM];
    for(v=0;v<g.vexnum;v++)
        visited[v]=0; /*初始化visited数组*/
    for(v=0;v<g.vexnum;v++)
        if(visited[v]==0) 
            DFS(g,v,visited);
    /*从未被访问过的v出发, DFS搜索*/
}

图的广度优先遍历(Breadth_First Search:BFS):

基本思想:— 模仿树的层次遍历过程。

遍历步骤: 在访问了起始点v之后,依次访问 v的邻接点;然后再依次(顺序)访问这些点(下一层)中未被访问过的邻接点;          直到所有顶点都被访问过为止

具体实现过程,例2:

广度优先遍历编程算法:(邻接表)

BFSTraverse(ALGraph g)
{ 
    // 邻接表存储 BFS 算法
    QElemType v,w,u;
    SqQueue Q; ArcNode *p;
    for(v=0;v<g.vexnum;v++) 
        visited[v]=0; //初始化visited数组
    InitQueue(&Q); //队列Q初始化
    for(v=0;v<g.vexnum ;v++) //从v出发广度优先搜索
    { 
        if (!visited[v])
        {
            visited[v]=1;
            printf("%d ",v); //输出v
            EnQueue(&Q,v); //v入队
            while(!EmptyQueue(Q)) //队列Q不空
            {
                DeQueue(&Q,&u); // u出队
                p=g.adjlist[u].firstarc ;
                while(p) //依次访问u的邻接点
                { 
                    w=p->adjvex;
                    if(!visited[w])
                    { 
                        visited[w]=1;
                        printf("%d ",w);
                        EnQueue(&Q,w); //w 入队
                    }
                    p=p->nextarc ; //p指向下一个邻接点
                }//end of while
            }//end of while
        }//end of if
    }//end of for
}//end of BFSTravers

 

 

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

数据结构——图的两种遍历方法 的相关文章

  • 服务器装系统都会有哪些坑,小白装机避坑——电脑装系统篇 二

    装机系统分区 首先你需要安装好你的固态硬盘 开机 进入系统 一般用的分区工具都是 DiskGenius 这个软件 粗暴的组装 不需要机箱 一台电脑里面只能设置一个盘作为系统盘 也就是我们的主分区 切记 先对硬件进行测试组装 看看能不能正常启
  • 1125 斐波那契数列

    题目描述 输入整数n 输出斐波那契数列的前n项 输入要求 输入一个整数n 1 lt n lt 12 输出要求 输出斐波那契数列的前n项 每个数后面都有空格 输入样例 6 输出样例 1 1 2 3 5 8 提示 斐波那契数列的排列规则为 第1
  • echarts legend文字颜色

    legend textStyle color fft
  • 一个有意思的let面试题

    今天看到一个面试题 let des 我在外边 let obj des 我在里面 foo function console log this des let bar obj foo bar 这个bar 调用后会打印出什么 本以为是考 this
  • 查看微信小程序的appID和secret

    https mp weixin qq com wxopen devprofile action get profile token 1504304474 lang zh CN 转载于 https www cnblogs com fuckin

随机推荐

  • springmvc源码学习(三十)@ControllerAdvice 全局异常处理

    目录 前言 一 示例 二 原理 前言 在请求到达了 DispatcherServlet 的处理流程 进入 doDispatch 以及后续流程处理业务的过程中出现异常 会进入到 processDispatchResult 处理异常 此时 如果
  • C++-- 如何在类外访问一个类中私有的成员变量?

    如何在类外访问一个类中私有的成员变量 我在网上搜答案的时候看到大部分回答都是在类内部创建一个接口 所以此方法我就不再多做赘述 今天我说的是利用指针 边看代码边理解 上代码 class Test private int a 10 int b
  • win32汇编语言实现冒泡排序

    1 背景 现在大多数的大规模程序并不是由汇编语言来编写 原因很简单 因为太耗时了 但是汇编语言仍然被广泛运用在配置硬件设备以及优化程序的执行速度和尺寸大小等方面 特别是在逆向工程方面 更需要深入理解与熟练掌握汇编语言 针对现阶段 看汇编基本
  • unity04 解决导入fbx文件黑模问题

    左上角window gt rendering gt lighting gt new lighting settings gt 勾选auto generating
  • TensorFlow在MNIST中的应用-卷积神经网络CNN

    参考 TensorFlow技术解析与实战 用TensorFlow搭建一个卷积神经网络CNN模型 并用来训练MNIST数据集 coding utf 8 20171115 HelloZEX 卷积神经网络
  • 【软件测试】----自动化测试详解

    自动化测试指软件测试的自动化 在预设状态下运行应用程序或者系统 预设条件包括正常和异常 最后评估运行 结果 将人为驱动的测试行为转化为机器执行的过程 常见的自动化测试工具 QTP selenium Rational Robot jmeter
  • QtDesigner设计中关于PyQt5与pyside2的报错坑

    关注公众号可获取资料分享 0 前言 Qt Designer是使用Qt部件设计和构建图形用户界面 gui 的Qt工具 您可以以 what you see is what you get WYSIWYG 的方式组合和自定义窗口或对话框 并使用不
  • JSON取值(key是中文或者数字)方式详解

    先准备一个json对象用于演示 var json name zhangsan 年龄 23 404 你可能迷路了 使用JS中with关键字 with json console log name 输出 zhangsan console log
  • 基于STM32的智能电子药盒设计

    1 前言 据报告显示中国有2 3亿的60岁以上老人 占全国总人口的六分之一 在老年人中 有65 以上的老年人都是慢性病患者 其中失能和半失能老人将近四千万 并且人口还在以加速度增长 老年人的身体健康成为社会密切关注的问题 大部分的老年人都患
  • JavaScript基本包装类型

    基本包装类型 为了便于操作基本类型值 ECMAScript还提供了3个特殊的引用类型 Boolean Number和String 这些类型与其它引用类型相似 但同时也具有与各自的基本类型相应的特殊行为 实际上 每当读取一个基本类型值的时候
  • ElasticSearch-全文检索-简单使用

    简介 https www elastic co cn what is elasticsearch 全文搜索属于最常见的需求 开源的 Elasticsearch 是目前全文搜索引擎的首选 它可以快速地储存 搜索和分析海量数据 维基百科 Sta
  • 类和对象

    一 类 类描述了一组具有相同属性和行为特征的对象 对象是类的实例 类是一种数据类型 而对象是该类型的变量 在c 语言中 一个类的定义包含数据成员和成员函数两部分内容 数据成员定义该类对象的属性 不同对象的属性值可以不同 成员函数定义了该类对
  • 回归分析及实际案例:预测鲍鱼年龄

    上一篇文章 线性回归 Linear regression 算法 引入 1 线性回归 算法的优点 结果易于理解 计算不复杂 缺点 对非线性数据拟合不好 目标 平方误差和最小 求解 对参数w求导等于0 的回归系数 模型预测 函数说明 标准回归
  • 开发者必备的网站。javascript手册,css手册

    参考手册大全 更多更好的网址请到http www loveboygirl com 在 电脑技术 参考手册 下面 网站开发人员一定喜欢 很多好工具哦 希望大家多多支持 桌面版手册 开源中国 开源中国工具 msdn技术资源库 technet M
  • leptonica依赖的相关库的生成

    leptonica依赖的相关库的生成 写在前面 笔者观摩大量大佬的教程完成的本篇文章 反正我是成功了 电脑Win10 64位 VS2017版本 用到的源码由于试过太多来源 部分已经忘记哪儿来的了 有空我也传份上来 哈哈 至于为此学习过的文章
  • startActivity流程学习

    文章目录 应用完全没有启动过 应用完全没有启动过 launcher从sm 管理java层的ServiceManager 的服务列表里面找到AMS的代理对象AMSProxy 调用AMS向Zygote发出socket请求 从Zygote进程fo
  • vi的复制粘贴命令

    vi编辑器有3种模式 命令模式 输入模式 末行模式 掌握这三种模式十分重要 命令模式 vi启动后默认进入的是命令模式 从这个模式使用命令可以切换到另外两种模式 同时无论在任何模式下只要按一下 Esc 键都可以返回命令模式 在命令模式中输入字
  • SpringBoot多数据源导致mybatis驼峰映射配置失效

    SpringBoot多数据源导致mybatis驼峰映射配置失效 1 正常情况下 直接配置即可生效 比如 开启驼峰映射 开启示例 properties文件中配置 mybatis configuration map underscore to
  • 踩了大坑 : go json.Marshal时,结构体字段需要大写

    go中根据首字母的大小写来确定可以访问的权限 如果首字母大写 作用域则可以被其他的包访问 如果首字母小写 作用域则只能在本包中使用 包括接口 类型 函数和变量等 可以简单的理解成 首字母大写是公有的 首字母小写是私有的 出现问题 需要将js
  • 数据结构——图的两种遍历方法

    遍历定义 从已给的图中某一顶点出发 沿着一些边 访遍图中所有的顶点 且使每个顶点仅被访问一次 就叫做图的遍历 遍历实质 找每个顶点的邻接点的过程 图的特点 图中可能存在回路 且图的任一顶点都可能与其它顶点相通 在访问完某个顶点之后可能会沿着