【数据结构——图】图的遍历(头歌习题)【合集】

目录

  • 第1关:邻接矩阵存储图的深度优先遍历
    • 任务描述
    • 相关知识
      • 邻接矩阵存储图
      • 图的遍历
        • DFS伪代码——邻接矩阵存储实现
    • 完整代码
  • 第2关:邻接表存储图的广度优先遍历
    • 任务描述
    • 相关知识
      • 邻接表存储图
      • 图的遍历
        • 广度优先遍历过程:
        • BFS伪代码——邻接表实现
    • 编程要求
    • 测试说明
    • 完整代码

第1关:邻接矩阵存储图的深度优先遍历

任务描述

本关任务:请你实现 dfs.cpp 里的void DFS( MatGraph* G, VertexType V)函数。 约定:顶点编号小的先输出。

相关知识

为了完成本关任务,你需要掌握:1.如何使用邻接矩阵存储图,2.如何遍历图。

邻接矩阵存储图

一个包含6个顶点的无向图如图所示。
请添加图片描述
图1 一个包含6个顶点的无向图

图 2 给出了对图 1 的无向图的存储结构图:每个顶点的名称由一个整数描述,顶点的相邻关系保存在邻接矩阵中,矩阵中值为 1 表示i号顶点到j号顶点有边,为 0 表示无边。
请添加图片描述
图2 图1的无向图的邻接矩阵

图的邻接矩阵定义如下:

typedef struct             //图的定义
{   
    int edges[MAXV][MAXV]; //邻接矩阵
    int n, e;              //顶点数, 边数
    VertexType vexs[MAXV]; //存放顶点信息
}  MatGraph;

给定指向该结构的指针G,就可以对图进行操作。

图的遍历

所谓图的遍历(graph traversal),也称为搜索(search),就是从图中某个顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次。遍历可以采取两种方法进行:深度优先搜索(DFS,depth first search)和广度优先搜索(BFS,breadth first search)。

深度优先遍历过程:
(1)从图中某个初始顶点v出发, 首先访问初始顶点v。
(2)选择一个与顶点v相邻且没被访问过的顶点w, 再从w出发进行深度优先搜索, 直到图中与当前顶点v邻接的所有顶点都被访问过为止。

算法设计思路:
深度优先遍历的过程体现出后进先出的特点:用栈或递归方式实现。
请添加图片描述

如何确定一个顶点是否访问过? 设置一个visited[] 全局数组, visited[i]=0表示顶点i没有访问; visited[i]=1表示顶点i已经访问过。

DFS伪代码——邻接矩阵存储实现

如果用邻接矩阵存储图(设顶点个数为 n),则 DFS 算法实现的伪代码如下:

DFS(图G, 顶点 i ) //从顶点 i 进行深度优先搜索
{ 
     visited[ i ] = 1; //将顶点 i 的访问标志置为 1 
     for( j=0; j<n; j++ ) //对其他所有顶点 j 
     { 
         //j 是 i 的邻接顶点,且顶点 j 没有访问过
         if( edges[i][j]==1 && !visited[j] ) 
         { 
             //递归搜索前的准备工作需要在这里写代码 
             DFS( j ); //从顶点 j 出发进行 DFS 搜索
             //以下是 DFS 的回退位置,在很多应用中需要在这里写代码  
         } 
     } 
}

对图1运行该算法的结果(从顶点5出发): 5 0 1 3 2 4。

编程要求
请你在右侧的代码窗口中实现dfs.cpp里的void DFS( MatGraph* G, VertexType V)函数。 注意遵守约定:顶点编号小的先输出。

测试说明
本关的测试过程如下:
1.平台编译 step1/dfs.cpp ;
2.平台运行该可执行文件,并以标准输入方式提供测试输入;
3.平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
输入输出格式说明:

输入格式:
输入V,开始遍历的起始顶点编号。

输出格式:
输出对图进行深度优先遍历的顶点序列,每个顶点编号前面有一个空格。

以下是平台对 step1/dfs.cpp 的测试样例:

样例输入:
无向图
请添加图片描述
测试输入:5

样例输出:
预期输出:DFS from 5: 5 1 3 0 2 4 6

开始你的任务吧,祝你成功!

完整代码

 #include "dfs.h"

/*
 * 从顶点V出发进行深度优先搜索。
 * 函数DFS应从编号为V的顶点出发递归地深度优先遍历图,
 * 遍历访问邻接点时,要求按序号递增的顺序。
 * 题目保证V是图中的合法顶点。
 * 参数G为邻接矩阵存储的图的表示。
 */
void DFS( MatGraph* G, VertexType V)
{
    /**
    * 请在下面的begin..end间编写程序代码,
    * 勿修改begin..end之外的代码。
    */
    /*******************begin*******************/
    int i=V; // 开始顶点
    visited[i]=1;
    printf(" %d", i);
    int j;
    for(j=0; j<G->n; j++){
        if(G->edges[i][j]==1 && !visited[j]){
            DFS(G, j);
        }
    }

    /*******************end********************/
}

int main()
{
    MatGraph* G;
    VertexType V;

    G = CreateGraph();
    scanf("%d", &V);
    printf("DFS from %d:", V);
    DFS(G, V);

    return 0;
}

在这里插入图片描述

第2关:邻接表存储图的广度优先遍历

任务描述

本关任务:请你实现 bfs.cpp 里的void BFS( AdjGraph* G, VertexType V)函数。 约定:顶点编号小的先输出。

相关知识

为了完成本关任务,你需要掌握:1.如何使用邻接表存储图,2.如何遍历图。

邻接表存储图

一个包含5个顶点的无向图如图所示。
一个包含5个顶点的无向图

图1 一个包含5个顶点的无向图
请添加图片描述

图 2 给出了对图 1 的无向图的邻接表存储结构图:每个顶点的名称由一个整数描述,对图中每个顶点i建立一个单链表, 将顶点i的所有邻接点链起来。

每个顶点的邻接表
请添加图片描述
每个单链表上添加一个表头结点(表示顶点信息)。并将所有表头结点构成一个数组, 下标为i的元素表示顶点i的表头结点。

邻接表
请添加图片描述

图2 图1的无向图的邻接表

图的邻接表存储方法是一种顺序分配与链式分配相结合的存储方法,如图3所示。

图的邻接表
请添加图片描述

图3 图的邻接表表示形式

一个带权的有向图(网)的邻接表存储形式如图4所示。

带权有向图的邻接表存储形式
请添加图片描述
图4 带权有向图的邻接表存储结构图

图的邻接表存储类型定义如下:

typedef struct ANode
{     int adjvex;            //该边的终点编号
      struct ANode *nextarc;    //指向下一条边的指针
      int weight;            //该边的权值等信息
}  ArcNode;
typedef struct Vnode
{    Vertex data;            //顶点信息
     ArcNode *firstarc;        //指向第一条边
}  VNode;
typedef struct 
{     VNode adjlist[MAXV] ;    //邻接表
       int n, e;        //图中顶点数n和边数e
} AdjGraph;

个邻接表通常用指针引用:

带权有向图的邻接表 请添加图片描述
给定指向该结构的指针G,就可以对图进行操作。

图的遍历

所谓图的遍历(graph traversal),也称为搜索(search),就是从图中某个顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次。遍历可以采取两种方法进行:深度优先搜索(DFS,depth first search)和广度优先搜索(BFS,breadth first search)。

广度优先遍历过程:

广度优先搜索(BFS,Breadth First Search)是一个分层的搜索过程,没有回退过程,是非递归的。其访问过程如下:
(1)访问初始点v, 接着访问v的所有未被访问过的邻接点v1, v2, …, vt。
(2)按照v1, v2, …, vt的次序, 访问每一个顶点的所有未被访问过的邻接点。   
(3)依次类推, 直到图中所有和初始点v有路径相通的顶点都被访问过为止。

算法设计思路:
广度优先搜索遍历体现先进先出的特点, 用队列实现。

广度优先搜索过程 请添加图片描述

如何确定一个顶点是否访问过? 设置一个visited[] 全局数组, visited[i]=0表示顶点i没有访问; visited[i]=1表示顶点i已经访问过。

BFS伪代码——邻接表实现

如果用邻接表存储图,则 BFS 算法实现的伪代码如下:

BFS(图 G, 顶点 i ) //从顶点 i 进行广度优先搜索
{ 
   visited[ i ] = 1; //将顶点 i 的访问标志置为 1 
将顶点 i 入队列; 
   while( 队列不为空 ) 
   { 
      取出队列头的顶点,设为 k 
      p = 顶点 k 的边链表表头指针
      while( p 不为空 ) 
      { 
      //设指针 p 所指向的边结点所表示的边的另一个顶点为顶点 j 
         if( 顶点 j 未访问过 ) 
         { 
            将顶点 j 的访问标志置为 1 
            将顶点 j 入队列
         } 
         p = p->nextarc; //p 移向下一个边结点
      } //end of while 
   } //end of while 
} //end of BFS

对图1运行该算法的结果(从顶点2出发): 2 1 3 4 0。

编程要求

请你在右侧的代码窗口中实现bfs.cpp里的void BFS( AdjGraph* G, VertexType V)函数。 注意遵守约定:顶点编号小的先输出。

注:本关提供C++ STL队列容器queue,你可以直接使用。

测试说明

本关的测试过程如下:
1.平台编译 step2/bfs.cpp 并生成可执行文件;
2.平台运行该可执行文件,并以标准输入方式提供测试输入;
3.平台获取该可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。
输入输出格式说明:

输入格式:
输入V,开始遍历的起始顶点编号。

输出格式:
输出对图进行广度优先遍历的顶点序列,每个顶点编号前面有一个空格。

以下是平台对 step2/bfs.cpp 的测试样例:

样例输入:
无向图
请添加图片描述

测试输入:2

样例输出:
预期输出:BFS from 2: 2 0 3 5 4 1 6

开始你的任务吧,祝你成功!

完整代码

#include "bfs.h"

/*
 * 从顶点V出发进行广度优先搜索。
 * 函数BFS应从编号为V的顶点出发广度优先遍历图,
 * 遍历访问邻接点时,要求按序号递增的顺序。
 * 题目保证V是图中的合法顶点。
 */
void BFS( AdjGraph* G, VertexType V)
{
    /*******************begin*******************/
    int k; // 队列头顶点
    int i=V;
    ArcNode *p;  // 链表
    // 初始化队列  队列保存访问过的顶点
    queue<int> qu;
    // 初始化visited数组
    int visited[MAXV];
    for(int b=0; b<G->n; b++){
        visited[b]=0;
    }
    printf(" %d", i);
    visited[i]=1;
    // 开始BFS
    qu.push(i);
    while(!qu.empty()){
        k = qu.front();
        qu.pop(); 
        p = G->adjlist[k].firstarc;
        while(p!=NULL){
            if(visited[p->adjvex]==0){  // 当前节点未访问
                printf(" %d", p->adjvex);
                visited[p->adjvex]=1;
                qu.push(p->adjvex);
            }
            p=p->nextarc;
        }
    }
   
    /*******************end*******************/
}

int main()
{
    AdjGraph* G;
    VertexType V;

    G = CreateGraph();
    scanf("%d", &V);
    printf("BFS from %d:", V);
    BFS(G, V);

    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/282332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装Hadoop:Hadoop的单机模式、伪分布式模式——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项

前言 Hadoop包括三种安装模式&#xff1a; 单机模式&#xff1a;只在一台机器上运行&#xff0c;存储是采用本地文件系统&#xff0c;没有采用分布式文件系统HDFS&#xff1b;伪分布式模式&#xff1a;存储采用分布式文件系统HDFS&#xff0c;但是&#xff0c;HDFS的名称节点…

2024 GMF|The Sandbox 为创作者赋能的新时代

以新的 GMF 模型和专门的参与池奖励来开启 2024 年吧。 11 月 3 日&#xff0c;我们在香港全球创作者日上宣布&#xff0c;The Sandbox 已为所有创作者分配了100,000,000 SAND&#xff0c;将通过 GMF 进行分发。作为首次启动的建设者挑战&#xff0c;我们准备了专门的 SAND 参与…

day9--java高级编程:多线程

1 Day16–多线程01 1.1 程序概念 程序(program)&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 1.2 进程 1.2.1 概念 进程(process)&#xff1a;是程序的一次执行过程&#xff0c;或是正在运行的一个程序。是一…

2024年【安全员-A证】考试内容及安全员-A证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证考试内容参考答案及安全员-A证考试试题解析是安全生产模拟考试一点通题库老师及安全员-A证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-A证最新解析学员顺利通过考试。 1、【多选题】下列关于门…

龙年红包封面来了,可以领取了。

今天是周六&#xff0c;后天就是元旦了&#xff0c;过完元旦就快要过年了&#xff0c;大家又要开始发红包和收红包了。下面分享一个腾讯的龙年红包封面给大家&#xff0c;可以免费领取&#xff0c;大家可以看下我领取的发红包的效果图&#xff0c;如下所示。 下面这个是红包打开…

Unity之组件的生命周期

PS&#xff1a;第二天&#xff0c;依旧在摸鱼学unity 一、组件的概念 我本身是由Web后端转到了游戏后端&#xff0c;最近因为工作原因在学ET框架。学到了 ECS 编程模式开发&#xff08;E —— Entity&#xff0c;C —— Component &#xff0c; S —— System&#xff09;实体、…

linux go环境安装 swag

下载依赖包 go get -u github.com/swaggo/swag编译 移动到下载的go-swagger包目录,一般在$GOPATH/pkg/mod下 查看 GOPATH echo $GOPATHcd /root/GolangProjects/pkg/mod/github.com/swaggo/swagv1.16.2go install ./cmd/swag/不出意外&#xff0c;$GOPATH/bin下 已经有了sw…

记一次redis内存没满发生key逐出的情况。

现象&#xff1a; 从监控上看&#xff0c;redis的内存使用率最大是80%&#xff0c;但是发生了key evicted 分析&#xff1a; 原因1、可能是阿里云监控没抓取到内存100%监控数据。 阿里控制台监控监控粒度是5秒。 内存使用率的计算方法。 used_memory_human/maxmemory 原因2、…

使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题

开始使用富文本组件editor时&#xff0c;不知如何调用相关API设置富文本内容和获取内容&#xff0c;本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1&#xff09;editorContext 2&#xff09; editorContext.setContents…

大数据爱好者福音:Kudu框架学习网站,助你一臂之力!

介绍&#xff1a;Kudu是由Cloudera开源的列式存储引擎&#xff0c;专为处理大数据而设计。它是为了解决Hadoop生态系统中的一些挑战而被引入的&#xff0c;如流式实时计算结果的更新和时间序列相关应用等需求。 Kudu具有几个显著的特点&#xff1a;首先&#xff0c;它是用C语言…

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展&#xff0c;尤其是在编程领域。一开始&#xff0c;ChatGPT和类似的语…

Zookeeper-Zookeeper应用场景实战(二)

1. Zookeeper 分布式锁实战 1.1 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Synchronized&#xff08;同步&#xff09;或者其他同一个 JVM内Lock机制来解决多线程间的同步问题。在分布式集群工作的开发场景中&#xff0c;就需要 一种…

前端大屏适配几种方案

记录一下前端大屏的几种适配方案。 我们是1920*1080的设计稿。 目录 目录 一、方案一&#xff1a;remfont-size 二、方案二&#xff1a;vw&#xff08;单位&#xff09; 三、方案三&#xff1a;scale&#xff08;缩放&#xff09;强烈推荐 1、根据宽度比率进行缩放 2、动…

十大排序算法归纳

目录 排序算法的分类 插入排序算法模板 选择排序算法模板 冒泡排序算法模板 希尔排序算法模板 快速排序算法模板 归并排序算法模板 堆排序算法模板 基数排序算法模板 计算排序算法模板 桶排序算法模板 排序算法的分类 插入&#xff1a;插入&#xff0c;折半插入&am…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] &#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。其诞…

八个理由:从java8升级到Java17

目录 前言 1. 局部变量类型推断 2.switch表达式 3.文本块 4.Records 5.模式匹配instanceof 6. 密封类 7. HttpClient 8.性能和内存管理能力提高 前言 从Java 8 到 Java 20&#xff0c;Java 已经走过了漫长的道路&#xff0c;自 Java 8 以来&#xff0c;Java 生态系统…

软件工程PPT 笔记摘录(2)

分析软件需求 UML 提供了用例图来分析和描述用例视角的软件需求模型 UML 提供了交互图和状态图来描述行为视角的软件需求模型 UML 提供了类图来描述和分析业务领域的概念模型 顺序图&#xff1a;强调消息传递的时间序 通信图&#xff1a;突出对象间的合作 类图&#xff0…

vscode调试 反汇编c/c++ 查看汇编代码gdb/lldb

先看下流程&#xff01; 先看下流程&#xff01; 有问题请留言&#xff01; 文章目录 必备F5开启调试左侧侧边栏->确保打开回调栈右键函数栈->查看反汇编 方法二&#xff1a;手动输入命令查看 必备 使用c/c 插件&#xff0c;这应该是必备的。 F5开启调试 左侧侧边栏-&…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date&#xff0c;它代表一个日期&#xff0c;采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先&#xff0c;我们可以通过字符串的索引来提取年、月和日的数值&…

C语言实验5:结构体

目录 一、实验要求 二、实验原理 1. 普通结构体 1.1 显示声明结构体变量 1.2 直接声明结构体变量 ​编辑 1.3 typedef在结构体中的作用 2. 结构体的嵌套 3. 结构体数组 4. 指向结构体的指针 4.1 静态分配 4.2 动态分配 三、实验内容 1. 学生数据库 代码 截图 …