数据结构【图篇】

news2024/11/17 12:33:07

数据结构【图篇】


文章目录

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


前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


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

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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);                         //初始化辅助队列Q
    for(i=0;i<G.vexnum;++i)               //从0号顶点开始遍历
        if(!visited[i])                   //对每个连通分量调用一次BFS
            BFS(G,i);                     //vi未访问过,从vi开始BFS
}

void BFS(MGraph G,int v){                 //从顶点v出发,广度优先遍历图G
    visit(v);                             //访问初始顶点v
    visited[v]=TRUE;                      //对w做已访问标记
    Enqueue(Q,v);                         //顶点v入队列Q
    while(!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);                   //访问顶点w
                visited[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);                         //初始化辅助队列Q
    for(i=0;i<G.vexnum;++i)               //从0号顶点开始遍历
        if(!visited[i])                   //对每个连通分量调用一次BFS
            DFS(G,i);                     //vi未访问过,从vi开始DFS
}

void DFS(MGraph G,int v){                 //从顶点v出发,深度优先遍历图G
    visit(v);                             //访问初始顶点v
    visited[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;                //路径长度加1
                path[w]=u;                  //最短路径应从u到w
                visited[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;                   //输出顶点i
        for(p=G.vertices[i].firstarc;p;p=p->nextarc){
            //将所有i指向的顶点的入度减1,并且将入度减为0的顶点压入栈S
            v=p->adjvex;
            if(!(--indegree[v]))
                Push(S,v);                  //入度为0,则入栈
        }
    }
    if(count<G.vexnum)
        return false;                       //排序失败,有向图中有回路
    else
        return 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])                   //对每个连通分量调用一次BFS
            DFS(G,v);                     //vi未访问过,从vi开始BFS
}

void DFS(MGraph G,int v){                 //从顶点v出发,深度优先遍历图G
    visited[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.coloradmin.cn/o/1352451.html

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

相关文章

Java中100==100为true,而1000==1000为false?

前言 今天跟大家聊一个有趣的话题&#xff0c;在Java中两个Integer对象做比较时&#xff0c;会产生意想不到的结果。 例如&#xff1a; Integer a 100; Integer b 100; System.out.println(ab);其运行结果是&#xff1a;true。 而如果改成下面这样&#xff1a; Integer …

八大算法排序@堆排序(C语言版本)

目录 堆排序大堆排序概念算法思想建堆建堆核心算法建堆的代码 排序代码实现 小堆排序代码实现时间复杂度空间复杂度 堆排序 堆排序借用的是堆的特性来实现排序功能的。大堆需要满足父节点大于子节点&#xff0c;因此堆顶是整个数组中的最大元素。小堆则相反&#xff0c;要求父节…

在Android设备上设置和使用隧道代理HTTP

随着互联网的深入发展&#xff0c;网络信息的传递已经成为人们日常生活中不可或缺的一部分。对于我们中国人来说&#xff0c;由于某些特殊的原因&#xff0c;访问国外网站时常常会遇到限制。为了解决这个问题&#xff0c;使用代理服务器成为了许多人的选择。而在Android设备上设…

WPD小波包理解

WPD是分析信号特性和提供具有时频局部化函数的正交小波基的有效工具&#xff0c;同时也是一种小波分解&#xff0c;它可以将原始信号分解成若干子层。小波分解实现了单侧分解&#xff0c;但它只分离频率的低通分量。相比之下&#xff0c;WPD提供了更精确的信号分析&#xff0c;…

40道java集合面试题含答案(很全)

1. 什么是集合 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器集合类存放的都是对象的引用&#xff0c;而不是对象的本身集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)。 2. 集合的特点 集合的特点主要有如下两…

成为比开发硬气的测试人,我都经历了什么?

我的职业生涯很简单&#xff0c;可以说&#xff0c;我的测试生涯就是我的职业生涯。 大学的专业是计算机&#xff0c;当年是热门的学科&#xff0c;但自己的计算机知识不强悍&#xff0c;又加上学校的硬核是金融业&#xff0c;来学校校招的都是各大银行&#xff0c;且都是需要…

shopee利润怎么算?看妙手ERP如何帮您精准掌握店铺利润明细!

最近&#xff0c;妙手收到不少卖家朋友反应&#xff1a;“每个月对账的时候&#xff0c;常常遇到店铺利润明细不准确的情况。明明利润上显示是赚钱的&#xff0c;但是实际计算后发现店铺是亏损的&#xff0c;却找不到具体原因。”其实&#xff0c;究其根本就是&#xff1a;店铺…

2024货运市场继续回暖,满帮有望抓牢成长主旋律

2023年&#xff0c;物流货运行业将对它“刻骨铭心”。首次告别过去三年的特殊波动&#xff0c;物流货运的每一条细分赛道&#xff0c;都在努力跑出新速度&#xff0c;力图加速行业的修复&#xff0c;并走向高质量发展。中国物流与采购联合会在12月底指出&#xff0c;2023年物流…

ASP.NET Core基础之图片文件(一)-WebApi访问静态图片

阅读本文你的收获&#xff1a; 学会在WebApi项目中访问静态图片了解静态文件中间件UseStaticFiles的用法 系统中免不了要去处理图片文件&#xff0c;比如上传商品的图片、显示商品的图片&#xff0c;访问系统中的图片等等&#xff0c;根据微软官网描述&#xff1a; 静态文件&a…

运维人员的逆袭:IT界的“万金油”如何迈向人工智能时代

一、运维人员的角色变迁 1、从“修理工”到“系统守护者” 在传统的IT环境中&#xff0c;运维人员的主要任务是维护服务器、网络设备和数据库等基础设施。他们需要对硬件设备进行定期检查和维修&#xff0c;以确保系统的稳定运行。随着云计算和虚拟化技术的普及&#xff0c;运…

认真学SQL——MySQL入门之DQL多表查询

多表查询 本质: 把多个表通过主外键关联关系连接(join)合并成一个大表,再去查询 知识点&#xff1a; 外键 foreign key 外键概念: 在从表(多方)创建一个字段&#xff0c;引用主表(一方)的主键,对应的这个字段就是外键。 外键特点&#xff1a; 1:从表外键的值是对主表主键…

mysql 单表 操作 最大条数验证 以及优化

1、背景 开车的多年老司机&#xff0c;是不是经常听到过&#xff0c;“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”&#xff0c;“你这个表数据都马上要到 2000w 了&#xff0c;难怪查询速度慢”。 2、实验 实验一把看看… 建一张表 CREATE TABL…

【论文+在线运行】AnyText:能准确写汉字的AI绘图工具

源码&#xff1a;https://github.com/tyxsspa/AnyText 阿里在线运行: https://modelscope.cn/studios/damo/studio_anytext/summary 论文&#xff1a;2311.AnyText: Multilingual Visual Text Generation And Editing 一、AnyTexT是什么&#xff1f; 是一个基于扩散模型的&am…

四、HTML 属性

属性是 HTML 元素提供的附加信息。 一、HTML 属性 HTML 元素可以设置属性属性可以在元素中添加附加信息属性一般描述于开始标签属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 二、 属性实例 HTML 链接由 <a> 标签定义。链接的地…

用户管理第2节课 -- idea 2023.2 创建表--鱼皮

二、【先确定idea版本&鱼皮是否一致&#xff0c;再决定看不看这行】建表 2.1 idea 里连接数据库&#xff0c;通过可视化建表 2.1.1 清空表中数据 的 命令 truncate 清空 2.1.2 先输入删除表&#xff0c;的命令&#xff0c;再选中这行命令&#xff0c;执行&#xff0c;…

中科驭数鄢贵海新年演讲:数字经济下的算力基础先行,DPU自主创新力量大有可为

近日&#xff0c;中科驭数创始人、CEO鄢贵海受邀在北京电视台《金融街午餐会》新年特别活动中发表新年演讲。 鄢贵海在新年演讲中提到&#xff0c;在21世纪头30年&#xff0c;我们不可思议地经历了三次重要的科技变革&#xff0c;分别是互联网的普及、移动互联网的崛起、以及人…

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…

打造高效会员卡营销策划方案,提升门店业绩

在激烈的行业竞争中&#xff0c;如何有效提升店铺的业绩&#xff0c;提高客户粘性和消费频次呢&#xff1f;答案可能就在你手中——那就是有效的会员卡营销策略。下面给大家探讨如何设计会员卡营销策划方案&#xff0c;从而增加客户的忠诚度&#xff0c;并推动销售增长。以目前…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的&#xff0c;并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 先看效果 Tree 树形控件 保留过滤值的子级 <el-treeclass"filter-t…

希亦、RUUFFY、鲸立内衣洗衣机怎么样?爆款对比谁是巅峰榜首

内衣洗衣机是最近这两年兴起的一款家庭小型电器&#xff0c;现在很多小伙伴都注重到卫生健康问题了&#xff0c;然而市面上有着太多三无产品的内衣洗衣机&#xff0c;不仅很难把内衣裤清洗干净还很容易出现漏电的可能&#xff0c;所以这种内衣洗衣机真的存着很危险的隐患&#…