数据结构【图篇】

数据结构【图篇】


文章目录

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


前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


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

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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,一经查实,立即删除!

相关文章

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

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

transformers Trainer自定义optimizer和scheduler

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

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

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

医院配电能效监管方案

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

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 简介 向日葵电脑版是一款拥有多年…

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…

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…

京东商品详情API:数据分析和挖掘以优化销售策略

京东商品详情API提供的数据分析和挖掘功能可以帮助商家优化销售策略&#xff0c;提高销售额和用户转化率。以下是一些可能的应用场景&#xff1a; 商品关联分析&#xff1a;通过分析商品之间的关联规则&#xff0c;商家可以发现哪些商品经常一起被购买&#xff0c;从而制定捆绑…

c++ / day04

1. 整理思维导图 2. 全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类&a…

跟cherno手搓游戏引擎【1】:配置与入口点

环境配置&#xff1a; 编译环境&#xff1a;VS2019 创建两个项目&#xff1a; 设置Sandbox为启动项&#xff1a; 设置sandbox的配置属性-常规-输出目录\中间目录为如下&#xff1a; 预处理定义&#xff1a;为了配置一些只有windows才能用的函数。 设置YOTOEngin&#xff08;我…

【大数据HA】keepalived结合haproxy实现高可用的HMS

背景 上一篇实现了haproxy代理后端HMS服务实现高可用。但是对于haproxy还是单点故障&#xff0c;所以需要对haproxy进一步做HA&#xff0c;实现真正的后端服务的HA。 要实现haproxy的HA&#xff0c;需要使用到keepalived&#xff0c;使用keepalived是VIP虚拟IP服务&#xff0…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于预训练ESPCN的轻量化图像超分辨率模型TPU部署方案

2023 CCF 大数据与计算智能大赛 《基于TPU平台实现超分辨率重建模型部署》 作品名&#xff1a;基于预训练ESPCN的轻量化图像超分辨率模型TPU部署方案 队伍名&#xff1a;Absofastlutely 蒋松儒 计算机科学与技术系 硕士 南京大学 中国-江苏 kahsoltqq.com 吕欢欢 计算…

经典卷积神经网络-VGGNet

经典卷积神经网络-VGGNet 一、背景介绍 VGG是Oxford的Visual Geometry Group的组提出的。该网络是在ILSVRC 2014上的相关工作&#xff0c;主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG有两种结构&#xff0c;分别是VGG16和VGG19&#xff0c;两者并…

01-SpringCloud微服务入门

1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.1.单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打…

如何利用Oracle官方网站不登录账号下载和安装非最新版本的JDK(版本自由选择)

一、JDK概述 JDK(Java Development Kit)是Java开发工具集,是针对Java编程语言的软件开发环境。它包含了Java编译器、JRE(Java运行时环境)以及其他一些用于开发、调试和测试Java应用程序的工具,是Java开发人员的必备工具。 二、JDK下载 进入Oracle官方网站,我们很容易发…

桌面天气预报软件 Weather Widget free mac特点介绍

Weather Widget free for Mac多种吸引人的小部件设计可供选择&#xff0c;可以随时了解天气&#xff01;还可以在Dock和菜单栏中为您提供简短的天气预报或当前状况的概述。 Weather Widget free for Mac软件介绍 始终在桌面上使用时尚的天气小部件来随时了解天气&#xff01;多…