8648 图的深度遍历

### 思路
1. **图的邻接表存储结构**:使用邻接表存储图的顶点和边信息。
2. **基本操作函数**:包括创建图、查找顶点、获取顶点值、获取第一个邻接顶点、获取下一个邻接顶点等。
3. **深度优先遍历(DFS)**:从某个顶点出发,递归地访问所有未访问的邻接顶点。

### 伪代码
1. **创建图**:
   - 读取图的类型、顶点数和边数。
   - 初始化顶点信息和邻接表。
   - 读取每条边的信息,更新邻接表。

2. **深度优先遍历(DFS)**:
   - 初始化访问标志数组。
   - 对每个未访问的顶点调用DFS函数。
   - 在DFS函数中,标记当前顶点为已访问,并递归访问所有未访问的邻接顶点。

### C++代码
 

#include "string.h"
#include "malloc.h"
#include "stdio.h"
#include "stdlib.h"typedef int InfoType;
#define MAX_NAME 3
typedef char VertexType[MAX_NAME];
#define MAX_VERTEX_NUM 20
typedef enum { DG, DN, AG, AN } GraphKind;typedef struct ArcNode {int adjvex;struct ArcNode *nextarc;InfoType *info;
} ArcNode;typedef struct {VertexType data;ArcNode *firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];typedef struct {AdjList vertices;int vexnum, arcnum;int kind;
} ALGraph;int LocateVex(ALGraph G, VertexType u) {for (int i = 0; i < G.vexnum; ++i)if (strcmp(u, G.vertices[i].data) == 0)return i;return -1;
}void CreateGraph(ALGraph *G) {int i, j, k, w;VertexType va, vb;ArcNode *p;scanf("%d", &(*G).kind);scanf("%d%d", &(*G).vexnum, &(*G).arcnum);for (i = 0; i < (*G).vexnum; ++i) {scanf("%s", (*G).vertices[i].data);(*G).vertices[i].firstarc = NULL;}for (k = 0; k < (*G).arcnum; ++k) {if ((*G).kind == 1 || (*G).kind == 3)scanf("%d%s%s", &w, va, vb);elsescanf("%s%s", va, vb);i = LocateVex(*G, va);j = LocateVex(*G, vb);p = (ArcNode *)malloc(sizeof(ArcNode));p->adjvex = j;if ((*G).kind == 1 || (*G).kind == 3) {p->info = (int *)malloc(sizeof(int));*(p->info) = w;} else {p->info = NULL;}p->nextarc = (*G).vertices[i].firstarc;(*G).vertices[i].firstarc = p;if ((*G).kind >= 2) {p = (ArcNode *)malloc(sizeof(ArcNode));p->adjvex = i;if ((*G).kind == 3) {p->info = (int *)malloc(sizeof(int));*(p->info) = w;} else {p->info = NULL;}p->nextarc = (*G).vertices[j].firstarc;(*G).vertices[j].firstarc = p;}}
}VertexType *GetVex(ALGraph G, int v) {if (v >= G.vexnum || v < 0)exit(0);return &G.vertices[v].data;
}int FirstAdjVex(ALGraph G, VertexType v) {int v1 = LocateVex(G, v);ArcNode *p = G.vertices[v1].firstarc;if (p)return p->adjvex;elsereturn -1;
}int NextAdjVex(ALGraph G, VertexType v, VertexType w) {int v1 = LocateVex(G, v);int w1 = LocateVex(G, w);ArcNode *p = G.vertices[v1].firstarc;while (p && p->adjvex != w1)p = p->nextarc;if (!p || !p->nextarc)return -1;elsereturn p->nextarc->adjvex;
}int visited[MAX_VERTEX_NUM];
void (*VisitFunc)(char *v);void DFS(ALGraph G, int v) {visited[v] = 1;VisitFunc(G.vertices[v].data);for (int w = FirstAdjVex(G, G.vertices[v].data); w >= 0; w = NextAdjVex(G, G.vertices[v].data, G.vertices[w].data)) {if (!visited[w])DFS(G, w);}
}void DFSTraverse(ALGraph G) {for (int i = 0; i < G.vexnum; i++)visited[i] = 0;VisitFunc = print;for (int i = 0; i < G.vexnum; i++) {if (!visited[i])DFS(G, i);}printf("\n");
}void print(char *i) {printf("%s ", i);
}int main() {ALGraph g;CreateGraph(&g);DFSTraverse(g);return 1;
}

### 总结
该代码实现了图的邻接表存储结构,并提供了基本操作函数和深度优先遍历算法。通过输入图的类型、顶点数、边数和边的信息,构建图的邻接表,并进行深度优先遍历,输出遍历结果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用seata管理分布式事务

做应用开发时&#xff0c;要保证数据的一致性我们要对方法添加事务管理&#xff0c;最简单的处理方案是在方法上添加 Transactional 注解或者通过编程方式管理事务。但这种方案只适用于单数据源的关系型数据库&#xff0c;如果项目配置了多个数据源或者多个微服务的rpc调用&…

Java中的break、continue和return语句

break、continue和return break语句引入基本介绍基本语法示意图注意事项练习String字符串的比较 continue跳转控制语句基本介绍基本语法示意图 return跳转控制语句 break语句 引入 随机生成1-100的一个数&#xff0c;直到生成了97这个数&#xff0c;看看你一共用了几次&#…

Redis --- 第三讲 --- 通用命令

一、get和set命令 Redis中最核心的两个命令 get 根据key来取value set 把key和value存储进去 redis是按照键值对的方式存储数据的。必须要先进入到redis客户端。 语法 set key value &#xff1a; key和value都是字符串。 对于上述这里的key value 不需要加上引号&#…

【基础算法总结】链表篇

目录 一&#xff0c; 链表常用技巧和操作总结二&#xff0c;算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三&#xff0c;算法总结 一&#xff0c; 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…

Linux命令大全及小例子

撰写一份关于Linux命令大全的详尽报道和分析是一项重要的任务&#xff0c;旨在让读者全面了解Linux命令的用途和应用场景。Linux系统因其强大的命令行工具而闻名&#xff0c;无论是系统管理、文件操作还是网络配置&#xff0c;Linux命令行都提供了灵活且强大的解决方案。以下是…

保险丝基础知识

一、简介 保险丝&#xff08;fuse&#xff09;也被称为电流保险丝&#xff0c;它能够在电流异常升高到一定的高度和热度时&#xff0c;自动熔断切断电流&#xff0c;从而保护电路安全运行。 IEC127标准将它定义为“熔断体&#xff08;fuse-link)”。熔断体是由电阻率比较大而熔…

初识Linux · 文件(1)

目录 前言&#xff1a; 回顾语言层面的文件 理解文件的预备知识 文件和磁盘 使用和认识系统调用函数 前言&#xff1a; 本文以及下篇文章&#xff0c;揭露的都是Linux中文件的奥秘&#xff0c;对于文件来说&#xff0c;初学Linux第一节课接触的就是文件&#xff0c;对于C…

在树莓派上部署开源监控系统 ZoneMinder

原文&#xff1a;https://blog.iyatt.com/?p17425 前言 自己搭建&#xff0c;可以用手里已有的设备&#xff0c;不需要额外买。这套系统的源码是公开的&#xff0c;录像数据也掌握在自己手里&#xff0c;不经过不可控的三方。 支持设置访问账号 可以保存录像&#xff0c;启…

《深入理解java虚拟机》——java内存区域与内存溢出异常

我是很喜欢用java语言编写代码的。从开始学习到现在其实也是在一步步体会java语言的各方面&#xff0c;开始看深入理解java虚拟机这本书觉得java虚拟机的内部感觉就像是一个操作系统&#xff0c;也可以说是个计算机。想要深入的理解我觉得需要先从整体去看。为什么需要java虚拟…

ProtoBuf快速上手

文章目录 创建 .proto文件编译 .proto文件编译后生成的文件序列化与反序列化的使用 此篇文章实现内容&#xff1a; 对一个通讯录的联系人信息&#xff0c;使用PB进行序列化&#xff0c;并将结果输出对序列化的内容使用PB进行反序列化&#xff0c;解析联系人信息并输出联系人信…

redis-数据类型

十大数据类型 学习 redis 操作手册 英文 Commands 中文 Redis命令中心&#xff08;Redis commands&#xff09; – Redis中国用户组&#xff08;CRUG&#xff09; 学习方法 举出一个数据结构的应用场景&#xff08;理解数据结构特点&#xff09;&#xff0c;并操作&…

【Java的SPI机制】Java SPI机制:实现灵活的服务扩展

在Java开发中&#xff0c;SPI&#xff08;Service Provider Interface&#xff0c;服务提供者接口&#xff09;机制是一种重要的设计模式&#xff0c;它允许在运行时动态地插入或更换组件实现&#xff0c;从而实现框架或库的扩展点。本文将深入浅出地介绍Java SPI机制&#xff…

JAVA开源项目 旅游管理系统 计算机毕业设计

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同&#xff0c;类型也在改变&#xff0c;以后怎么写类型&#xff1f; yarn add axios1. 封装Axios 将Axios封装成一个类&#xff0c;同时重新封装request方法 重新封装request有几个好处&#xff1a; 所有的请求将从我们定义的requet请求中发送&#xff…

Vue3实现动态菜单功能

文章目录 0.效果演示1.搭建Vue3项目1.1 vite 脚手架创建 Vue3 项目1.2 设置文件别名1.3 安装配置 element-plus1.4 安装配置路由2.登录页面3.后台管理页面3.1 搭建后台框架3.2 左侧菜单栏3.3 header 用户信息3.4 主要内容3.5 footer4.配置静态路由5.记录激活菜单5.1 el-menu 绑…

信号处理快速傅里叶变换(FFT)的学习

FFT是离散傅立叶变换的快速算法&#xff0c;可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的&#xff0c;但是如果变换到频域之后&#xff0c;就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外&#xff0c;FFT可以将一个信号的频谱提取出来&am…

webpack信息泄露

先看看webpack中文网给出的解释 webpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换、打包或包裹任何资源。 如果未正确配置&#xff0c;会生成一个.map文件&#xff0c;它包含了原始JavaScript代码的映…

课设实验-数据结构-线性表-手机销售

题目&#xff1a; 代码&#xff1a; #include<stdio.h> #include<string.h> #define MaxSize 10 //定义顺序表最大长度 //定义手机结构体类型 typedef struct {char PMod[10];//手机型号int PPri;//价格int PNum;//库存量 }PhoType; //手机类型 //记录手机的顺序…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的&#xff0c;就是反馈给浏览器:这次请求是否成功&#xff0c;若失败&#xff0c;则出现失败原因 常见状态码: 200:OK&#xff0c;表示成功 404:Not Found&#xff0c;浏览器访问的资源在服务器上没有找到 403:Forbidden&#xff0c;访问被…

springboot系列--web相关知识探索三

一、前言 web相关知识探索二中研究了请求是如何映射到具体接口&#xff08;方法&#xff09;中的&#xff0c;本次文章主要研究请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、…