数据结构【图篇】

数据结构【图篇】


文章目录

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


前言

在这里插入图片描述

为什么突然想学算法了?

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

在这里插入图片描述


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

码蹄集,是在全国高等学校计算机教学与产业实践资源建设专家委员会(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,供大家更好的进行学习与刷题~( ̄▽ ̄~)~

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

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

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

相关文章

达梦数据库查询各表数据量/以及达梦更新统计信息

1、达梦数据库查询各表数据量 达梦数据库与开源的MySQL不一样&#xff0c;MySQL查询各表数据量非常简单 而达梦数据库就有一些地方要注意&#xff0c;先用这句去查↓ SELECT table_name, num_rows FROM all_tables WHERE tablespace_name 表空间名; 如果结果如下图一样&…

java代码中使用Groovy的三种方式详解

java代码中使用Groovy ​ Groovy语言是一种运行在java虚拟机上的一种动态语言&#xff0c;它可以单独使用&#xff0c;也可以配合java语言一起使用&#xff0c;下面的部分&#xff0c;我们将用java项目结合Groovy做一些学习和使用。 ​ 先建一个springboot项目&#xff0c;在…

深度学习|5.2 偏差和方差

偏差和方差 Bias&#xff08;偏差&#xff09;&#xff1a;偏差是指对样本点的估计值和实际值的偏离程度。偏差越大&#xff0c;样本点越不符合实际值。偏差衡量单个数据点的偏离程度&#xff0c;如下图的第二行。 Variance&#xff08;方差&#xff09;&#xff1a;方差能代表…

resetlogs失败故障恢复-ORA-01555---惜分飞

客户数据库resetlogs报错 Tue Dec 19 15:21:23 2023 ALTER DATABASE MOUNT Successful mount of redo thread 1, with mount id 1683789043 Database mounted in Exclusive Mode Lost write protection disabled Completed: ALTER DATABASE MOUNT Tue Dec 19 15:22:01 2023…

pytorch04:网络模型创建

目录 一、模型创建过程1.1 以LeNet网络为例1.2 LeNet结构1.3 nn.Module 二、网络层容器(Containers)2.1 nn.Sequential2.1.1 常规方法实现2.1.2 OrderedDict方法实现 2.2 nn.ModuleList2.3 nn.ModuleDict2.4 三种容器构建总结 三、AlexNet网络构建 一、模型创建过程 1.1 以LeNe…

短剧分销系统搭建,打造新的蓝海项目

近一年来&#xff0c;短剧占据了当下大众的碎片化时间&#xff0c;各大影视公司也纷纷加入到了短剧行业中。2023年一整年短剧的规模已经达到了三百多亿元&#xff0c;发展非常快。目前&#xff0c;短剧作为一种新的商业模式&#xff0c;已经受到了广泛认可&#xff0c;也为创业…

Python在金融大数据分析中的AI应用实战

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 随着人工智能时代的到来&#xff0c;Python作为…

app store里面的构建版本在线上传

开发苹果ios应用&#xff0c;无论是用原生开发、用hbuilderx开发还是用其他h5框架开发的app&#xff0c;都需要将打包好的ipa文件上传到app store。 在上架app store的过程中&#xff0c;我们会遇到下图的这样一个问题&#xff1a; 就是它要求我们上传一个构建版本&#xff0c…

基于SSM(非maven)的教室预约管理系统——有报告(Javaweb)

项目简介 本项目为基于SSM&#xff08;非maven&#xff09;的教室预约管理系统&#xff0c;本项目主要分为二种角色&#xff1a;用户&#xff0c;管理员 管理员拥有功能&#xff1a;教室信息管理、预约审核管理、预约记录查询、用户注册管理、修改个人信息、退出登录等 用户…

为团队进行文档赋能

大家好&#xff0c;才是真的好。 说来也巧&#xff0c;最近看一个论坛&#xff0c;有人问他们在公司内网管理接收到的外部发文&#xff0c;请问有什么办法工具能够快速的进行管理&#xff0c;在需要的时候供给大家搜索和查看。很多人提了不同的办法&#xff0c;比如说用文件共…

JavaBean

学习目的与要求 熟练掌握<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>等JSP的操作指令。 本章主要内容 编写JavaBean在JSP中使用JavaBean 一个JSP页面通过使用HTML标记为用户显示数据&#xff08;静态部分&#xff09;&#xff0c;页面中变量的…

【每日一题】2487. 从链表中移除节点-2024.1.3

题目&#xff1a; 2487. 从链表中移除节点 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &…

LeetCode做题总结 15. 三数之和(未完)

不会做&#xff0c;参考了代码随想录和力扣官方题解&#xff0c;对此题进行整理。 代码思路 思想&#xff1a;利用双指针法&#xff0c;对数组从小到大排序。先固定一个数&#xff0c;找到其他两个。 &#xff08;1&#xff09;首先对数组从小到大排序。 &#xff08;2&…

【vue/uniapp】使用 uni.chooseImage 和 uni.uploadFile 实现图片上传(包含样式,可以解决手机上无法上传的问题)

引入&#xff1a; 之前写过一篇关于 uview 1.x 版本上传照片 的文章&#xff0c;但是发现如果是在微信小程序的项目中嵌入 h5 的模块&#xff0c;这个 h5 的项目使用 u-upload 的话&#xff0c;图片上传功能在电脑上正常&#xff0c;但是在手机的小程序上测试就不会生效&#x…

声明式管理方(yaml)文件

声明式管理方(yaml)文件: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中。 3、编辑好的yaml文件需要依靠陈述是还是要依靠陈述式的命令发布到k8s集群当中 create只能创建&#xff0c;不能更新。从指定yaml文件中读取配置&#…

【华为机试】2023年真题B卷(python)-考古问题

一、题目 题目描述&#xff1a; 考古问题&#xff0c;假设以前的石碑被打碎成了很多块&#xff0c;每块上面都有一个或若干个字符&#xff0c;请你写个程序来把之前石碑上文字可能的组合全部写出来&#xff0c;按升序进行排列。 二、输入输出 三、示例 示例1: 输入输出示例仅供…

java练习题之常用类Object类,包装类

常用类 应用知识点&#xff1a; Object类 包装类 习题&#xff1a; 1&#xff1a;(Object 类)仔细阅读以下代码&#xff0c;写出程序运行的结果&#xff1b;并简述 和 equals 的区别。 true false 是判断两个变量或实例是不是指向同一个内存空间。 比较两个引用类型的地址&…

声明式管理方法

声明式管理方法&#xff08;yaml&#xff09;文件&#xff1a; 1&#xff0c;适合对资源的修改操作 2&#xff0c;声明式管理依赖于yaml文件&#xff0c;所有的内容都在yamI文件当中 3&#xff0c;编辑好的yaml文件&#xff0c;还是要依靠陈述式命令发布到k8s集群当中 发布的…

Spring见解 1

1.Spring概述 1.1.Spring介绍 ​ Spring是轻量级Java EE应用开源框架&#xff08;官网&#xff1a; http://spring.io/ &#xff09;&#xff0c;它由Rod Johnson创为了解决企业级编程开发的复杂性而创建 1.2.简化应用开发体现在哪些方面&#xff1f; IOC 解决传统Web开发中…

SpringBoot—支付—微信

一、支付流程 1.1、支付准备 1.获取商户号 微信商户平台 申请成为商户 > 提交资料 > 签署协议 > 获取商户号 2.获取 AppID 微信公众平台 注册服务号 > 服务号认证 > 获取APPID > 绑定商户号 3.申请商户证书 登录商户平台 > 选择 账户中心 > 安全…