数据结构【图篇】

数据结构【图篇】


文章目录

  • 数据结构【图篇】
  • 前言
    • 为什么突然想学算法了?
    • 为什么选择码蹄集作为刷题软件?
  • 目录
  • 一、图
    • (一)、图的存储
    • (二)、图的基本操作
    • (三)、最短路径问题
  • 二、拓扑排序
  • 三、结语


前言

在这里插入图片描述

为什么突然想学算法了?

> 用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中,要想完成任何实质性的工作,理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。
> 但从实际而言,是因为当下竞争压力逐渐增大,无论走哪一条路,都不免需要一些相对丰富的算法知识,是故,便产生了一个寒假巩固速成算法的计划,可能对于像我这种算法竞赛小白而言,几乎很难,但我仍然还是想尝试一下,毕竟,梦想还是要有的,万一实现了呢?~( ̄▽ ̄~)~

在这里插入图片描述


为什么选择码蹄集作为刷题软件?

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的,其依托全国各大名校计算机系和清华大学出版社等单位的强大资源,旨在为计算机学习爱好者提供全面和权威的计算机习题。
.
在这里插入图片描述


目录

一、图

(一)、图的存储

.
参考代码

#define MaxVertexNUm 100                    //顶点数目的最大值
//邻接矩阵法存储带权图(网)
#define INFINITY 0x3f3f3f3f                //宏定义常量“无穷”
typedef char VertexType;                    //顶点的数据类型
typedef int EdgeType;                       //带权图中边上权值的数据类型
typedef struct{char Vex[MaxVertexNUm];                 //顶点表int Edge[MaxVertexNUm][MaxVertexNUm];   //邻接矩阵,边表int vexnum,arcnum;                      //图的当前顶点数和边数/弧数
}MGraph;//邻接表法(顺序+链式存储)
//边/弧
typedef struct ArcNode{int adjvex;                             //边/弧指向那个结点struct ArcNode *next;                   //指向下一条弧的指针//InfoType info                         //边权值
}ArcNode;//顶点
typedef struct VNode{VertexType data;                        //顶点信息ArcNode *first;                         //第一条边/弧
}VNode,AdjList[MaxVertexNUm];//用邻接表存储的图
typedef struct{AdjList vertices;int vexnum,arcnum;
}ALGraph;

(二)、图的基本操作


/*Adjacent(G,x,y):判断图G是否存在边<x, y>或(x, y)。Neighbors(G,x):列出图G中与结点x邻接的边。lnsertVertex(G,x):在图G中插入顶点x。DeleteVertex(G,x):从图G中删除顶点x。AddEdge(G,x,y):若无向边(x, y)或有向边<x, y>不存在,则向图G中添加该边。RemoveEdge(G,xy):若无向边(x,y)或有向边<x, y>存在,则从图G中删除该边。FirstNeighbor(G,x):求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。NextNeighbor(G,x,y):假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。Get_edge_value(G,x,y):获取图G中边(x,y)或<x, y>对应的权值。Set_edge_value(G,x,y,v):设置图G中边(x, y)或<x, y>对应的权值为v。*///广度优先遍历
bool visited[MaxVertexNUm];               //访问标记数组,初始都为false;void BFSTraverse(MGraph G){                //对图G进行广度优先遍历for(i=0;i<G.vexnum;++i)visited[i]=FALSE;                 //访问标记数组初始化InitQueue(Q);                         //初始化辅助队列Qfor(i=0;i<G.vexnum;++i)               //从0号顶点开始遍历if(!visited[i])                   //对每个连通分量调用一次BFSBFS(G,i);                     //vi未访问过,从vi开始BFS
}void BFS(MGraph G,int v){                 //从顶点v出发,广度优先遍历图Gvisit(v);                             //访问初始顶点vvisited[v]=TRUE;                      //对w做已访问标记Enqueue(Q,v);                         //顶点v入队列Qwhile(!isEmpty(Q)){DeQueue(Q,v);                      //顶点v出列for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测v所有邻接点if(!visited[w]){                //w为v的尚未访问的邻接顶点visit(w);                   //访问顶点wvisited[w]=TRUE;            //对w做已访问标记EnQueue(Q,w);                 //顶点w入队列}}
}//深度优先遍历
bool visited[MaxVertexNUm];               //访问标记数组,初始都为false;void DFSTraverse(MGraph G){                //对图G进行深度优先遍历for(i=0;i<G.vexnum;++i)visited[i]=FALSE;                 //访问标记数组初始化InitQueue(Q);                         //初始化辅助队列Qfor(i=0;i<G.vexnum;++i)               //从0号顶点开始遍历if(!visited[i])                   //对每个连通分量调用一次BFSDFS(G,i);                     //vi未访问过,从vi开始DFS
}void DFS(MGraph G,int v){                 //从顶点v出发,深度优先遍历图Gvisit(v);                             //访问初始顶点vvisited[v]=TRUE;                      //对w做已访问标记for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测v所有邻接点if(!visited[w]){                //w为v的尚未访问的邻接顶点DFS(G,W);}
}

(三)、最短路径问题


//最短路径问题
//求顶点u到其他顶点的最短路径——BFS算法
void BFS_MIN_Distance(MGraph G,int u){                 //d[i]表示从u到i结点的最短路径for(i=0;i<G.vexnum;++i){d[i]=INFINITY;                     //初始化路径长度path[i]=-1;                        //最短路径从那个顶点过来}d[u]=0;visited[u]=TRUE;EnQueue(Q,u);while(!isEmpty(Q)){                    //BFS算法主过程DeQueue(Q,u);                      //队头元素u出列for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))if(!visited[w]){                //w为v的尚未访问的邻接顶点d[w]=d[u]+1;                //路径长度加1path[w]=u;                  //最短路径应从u到wvisited[w]=TRUE;            //对w做已访问标记EnQueue(Q,w);               //顶点w入队列}}
}

二、拓扑排序


//拓扑排序
bool TopologicalSort(MGraph G){InitStack(S);                           //初始化栈,存储入度为0的顶点for(int i=0;i<G.vexnum;i++)if(indegree[i]==0)Push(S,i);                      //将所有入度为0的顶点进栈int count = 0;                          //计数,记录当前已经输出的顶点数while(!IsEmpty(S)){                     //栈不空,则存在入度为0的顶点Pop(S,i);                           //栈顶元素出栈print[count++]=i;                   //输出顶点ifor(p=G.vertices[i].firstarc;p;p=p->nextarc){//将所有i指向的顶点的入度减1,并且将入度减为0的顶点压入栈Sv=p->adjvex;if(!(--indegree[v]))Push(S,v);                  //入度为0,则入栈}}if(count<G.vexnum)return false;                       //排序失败,有向图中有回路elsereturn true;                        //拓扑排序成功
}//逆拓扑排序
void DFSTraverse(MGraph G){                //对图G进行深度优先遍历for(v=0;v<G.vexnum;++v)visited[v]=FALSE;                 //访问标记数组初始化for(v=0;v<G.vexnum;++v)               //从0号顶点开始遍历if(!visited[v])                   //对每个连通分量调用一次BFSDFS(G,v);                     //vi未访问过,从vi开始BFS
}void DFS(MGraph G,int v){                 //从顶点v出发,深度优先遍历图Gvisited[v]=TRUE;                      //对w做已访问标记for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))if(!visited[w]){                //w为v的尚未访问的邻接顶点DFS(G,W);}print(v);                           //输出顶点
}

三、结语

感谢大家一直以来的不断支持与鼓励,码题集题库中的进阶塔350题正在逐步更新,之后会逐步跟进星耀,王者的题,尽请期待!!!
同时,也希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?

另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from=333.999.0.0,供大家更好的进行学习与刷题~( ̄▽ ̄~)~

愿你的结局,配得上你一路的颠沛流离。
在这里插入图片描述

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

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

相关文章

【PHP】判断字符串是否是json类型,并判断是否是有效数组

要在 PHP 中判断给定的字符串是否是 JSON&#xff0c;可以使用 json_decode() 函数和检查返回值的类型。以下是一个示例&#xff0c;展示了如何判断给定的字符串是否是 JSON&#xff0c;以及如何判断它是数组还是字符串&#xff1a; <?phpfunction isJson($string) {json_…

金融追梦者,向着春天出发——社科院与美国杜兰大学金融管理硕士

随着时代的进步和社会的变迁&#xff0c;教育已经不再是单纯的学生时代的事情&#xff0c;而是贯穿人的一生。特别是在金融行业&#xff0c;由于其变幻莫测的特性&#xff0c;在职继续攻读硕士学位的人越来越多。他们希望通过进一步的学习和研究&#xff0c;提升自己的专业素养…

transformers Trainer自定义optimizer和scheduler

1.需求 我自定义了一个evaluate方法&#xff0c;想在每一轮训练过后都执行一次。如果只是在TrainingArguments里设置warmup_steps100&#xff0c;那么每轮都会重置学习率&#xff0c;也就是每一轮开始的时候都会按照warmup刚开始的学习率进行训练&#xff0c;这就很头疼。 2.…

【双指针算法】-- 左右指针

左右指针 前言一、双指针算法二、左右指针1.用于在已排序数组中找到两个数使其和为特定值2.在字符串中判断是否为回文 总结 前言 今天在刷Leetcode的时候觉得自己双指针掌握的还是不错的记录一下,写个学习笔记,也方便以后翻阅,如果也帮助到你了,那真是太好啦! 本篇介绍的是左右…

js创建服务器,以及对接口的理解和创建

// 创建服务 const app http.createServer((req, res)>{ // 设置给前端返回信息的字符编码 res.setHeader(content-type, text/html; charsetutf-8) let address req.url.split(?)[0] //首先创建一个数组&#xff0c;后面把它的数据放在JSON文件 let…

医院配电能效监管方案

摘要:本文以医院能源监管系统为研究对象,采用智能化技术组建数据库、构建智能化的能耗信息管理系统,实现对医院的能源利用状况进行实时、准确的动态监管。具体而言,该系统建设的主要功能是对医院的能源消耗进行采集、上报、汇总与分析,并生成动态的数据和报表曲线,以及利用分析…

js实现将一张红色透明图改成黑色

获取到像素点&#xff0c;遇到255红色rgb的改为黑色0 ps:红色的rgb为255 0 0 function test(base64) {// 创建一个Canvas元素var canvas document.createElement("canvas");var context canvas.getContext("2d");var redStamp new Image();redStamp.src…

如何在Windows Redis中设置密码?

https://www.python100.com/html/3NQ9A968M2JX.html springboot 工程配置文件 application.yml 中配置如下 redis: timeout: 50000 port: 6379 host: 127.0.0.1 password: 123456 注意 password: 123456 冒号后有空格

SAP ABAP ZPL打印

前言 本文用于简单介绍在SAP中使用ZPL语言进行打印的开发步骤&#xff0c;由于对ZPL语言并不是很熟悉&#xff0c;所以ZPL相关的部分并不会很深入&#xff0c;主要介绍在SAP端如何动态填充ZPL内容及预览、打印。 什么是ZPL ZPL是斑马条码打印机工业型号用的编程语言。利用这些…

M3u8视频地址如何转为mp4视频

在当今数字化的时代&#xff0c;视频格式的转换已成为日常需求。M3u8格式的视频由于其分段的特性&#xff0c;常常给播放和编辑带来不便。而MP4格式则因其通用性和高质量而广受欢迎。那么&#xff0c;如何将M3u8视频地址转换为MP4格式呢&#xff1f;接下来&#xff0c;我们将为…

JRT代码结构调整和示例

之前一直没建表专门使用ORM的api&#xff0c;做模板设计器需要建表&#xff0c;就一边开发设计器一般测试和调整ORM的api&#xff0c;只有做业务才能知道哪些api使用别扭&#xff0c;写了设计器之后改进了ORM的api以方便业务操作数据库。新写法差不多是ORM操作数据库的稳定api了…

向日葵远程控制软件MySQL5.7的安装与配置

目录 一. 向日葵远程控制软件 1.1 简介 1.2 选择原因 1.3 安装及使用 1.4 使用场景 二. MySQL5.7 安装与配置 2.1 什么是MySQL 2.2 安装 MySQL5.7 2.2.1 安装步骤 2.2.2 内部连接 2.2.3 外部连接 三. 思维导图 一. 向日葵远程控制软件 1.1 简介 向日葵电脑版是一款拥有多年…

通信领域常见缩写说明

一、通信通用指标 QoS&#xff1a;Quality of Service(服务质量) 服务质量&#xff08;Quality of Service&#xff0c;QoS&#xff09;是指网络或通信系统为满足用户对服务质量的要求而采取的措施和技术。QoS描述了网络或通信系统在提供服务时对各种性能指标的控制和保证。它…

Java基础-----集合类(四)

文章目录 1. Iterator和ListIterator1.1 简介1.2 常用方法 2. remove方法2.1 比较foreach方式和迭代器方式删除元素2.2 找原因 -- 迭代器删除操作源码 1. Iterator和ListIterator 1.1 简介 1.Iterator 可以遍历List集合&#xff0c;也可以遍历Set集合&#xff1b; ListIterat…

05-SpringCloud-RabbitMQ-概述

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

常用开源渗透测试工具

信息搜集工具 ARL 资产侦察灯塔https://github.com/TophantTechnology/ARLAsamF 资产收集工具https://github.com/Kento-Sec/AsamFshuize信息搜集https://github.com/0x727/ShuiZe_0x727ENScan 企业信息搜集https://github.com/wgpsec/ENScan_GOEHole 指纹探测工具https://git…

HarmonyOS简介

HarmonyOS的起源 HarmonyOS的诞生可以追溯到华为对物联网时代的探索和布局。随着物联网技术的快速发展&#xff0c;华为看到了一个更加互联互通的世界的潜力&#xff0c;并决定开发一个全新的分布式操作系统来满足物联网设备的需求。因此&#xff0c;HarmonyOS在2019年由华为正…

从Windows 1.0到Windows 10的旅程:探索Windows系统的起源和第一个版本特点

学习目标&#xff1a; 了解Windows系统的发展历程和重要版本。理解每个版本的特点和改进。掌握每个版本的发布时间和重要功能。了解Windows系统对于个人用户和企业用户的市场影响。探索Windows系统在用户界面、性能优化和安全性方面的改进。理解Windows系统的持续创新和用户反…

Linux安装rabbitMq RPM安装 以及带延迟插件

rabbitmq安装 文档中rabbitmq下载链接 以及延迟插件 网盘下载 目前下载文件中版本已经过多个服务器安装测试 完全成功 1.安装执行 rpm -ivh openssl-libs-1.0.2k-19.el7.x86_64.rpm --force --nodeps rpm -ivh libnsl-2.34-28.el9_0.x86_64.rpm --force --nodeps rpm -ivh e…

Leetcode 70 爬楼梯

题意理解&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。其中每次只能爬1阶或2阶。 问&#xff1a;爬到楼顶有几种走法&#xff1f; 如: n1 爬一阶&#xff1a; 1 n2 爬两阶&#xff1a; 11 要么从第1阶再爬一阶&#xff0c;要么从第0阶&#xff0c;一次性爬两阶…