数据结构--图
树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。
推广--- 图
图形结构中,数据元素之间的关系是任意的。
一、图的基本概念
二、图的分类
三、图的相关术语
1、顶点的度
无向图:n个顶点找两条,没有方向,
2、路径和路径长度
3.子图
4.图的连通
1)无向图的连通
2)有向图的连通
5.生成树
#不讨论的图:
四、图的存储方法
1、邻接矩阵存储方法
对称矩阵:
一个对称矩阵是指矩阵的主对角线两侧的元素相等。在这个矩阵中,通过观察可以发现对称性质:矩阵的第i行第j列的元素等于第j行第i列的元素。
**无向图的邻接矩阵建图和度数输出(完整代码)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define N (100 + 5)
#define INF 0x3f3f3f3f//定义INF为一个十六进制无穷大常量typedef char VexType; //顶点为字符类型
typedef int EdgeType;//邻接矩阵类型为整型typedef struct {int n, m; //n个顶点,m条边VexType vex[N];//一维数组存放所有顶点的数据信息EdgeType edge[N][N];//邻接矩阵(二维数组存放图中所有顶点之间关系的信息)
} adjGraph;//1.邻接矩阵建图
adjGraph createGraph();
//2.输出图的信息(顶点、邻接矩阵)
void print(adjGraph g);
//3.输出图中每个顶点的度数
void printDegree(adjGraph g);int main()
{//1.建图adjGraph g = createGraph();//2.输出图的信息print(g);printDegree(g);return 0;
}adjGraph createGraph()//建图
{adjGraph g;memset(g.edge, 0, sizeof(g.edge));//内存设置函数--创建图的过程中,所有元素初始化为0// g.edge 邻接矩阵//sizeof(g.edge) 数组占用的总字节数scanf("%d%d", &g.n, &g.m);//输入顶点数和边数getchar();//吸收换行符//1.输入n个顶点for (int i = 0; i < g.n; i++) {scanf("%c ", &g.vex[i]);}//2.输入m条边,按照邻接矩阵存图for (int i = 0; i < g.m; i++) {char v1, v2;scanf("\n%c %c", &v1, &v2);//读入当前边的2个顶点int n1 = v1 - 'A', n2 = v2 - 'A';//将顶点字符转换为对应的数组索引。// 假设顶点标签是大写字母'A'、'B'、'C'等,通过将其减去字符'A'的ASCII码值// 可以得到对应的数组索引(0、1、2等)。 g.edge[n1][n2] = g.edge[n2][n1] = 1;//无向图,邻接矩阵对应的n1行n2列和n2n1列都赋值为1(邻接矩阵的对称性)//将对应的邻接矩阵元素设置为1,表示图中对应的顶点之间存在一条边。}return g;
}void print(adjGraph g)
{printf("图有%d个顶点,%d条边\n", g.n, g.m);printf("图的顶点是:");for (int i = 0; i < g.n; i++) {printf("%c ", g.vex[i]);}printf("\n图的邻接矩阵是:\n");for (int i = 0; i < g.n; i++) {for (int j = 0; j < g.n; j++) {printf("%4d", g.edge[i][j]);}printf("\n");}
}void printDegree(adjGraph g)
{printf("图中每个顶点的度数是:");for (int i = 0; i < g.n; i++) {int degree = 0;for (int j = 0; j < g.n; j++) {if (g.edge[i][j] == 1) {degree++;}}printf("%c: %d ", g.vex[i], degree);}printf("\n");
}
输入样例:
**有向图邻接矩阵建图和度数输出(附完整代码)
修改的部分:
- 将g.edge[n1][n2] = g.edge[n2][n1] = 1; 修改为 g.edge[n1][n2] = 1; 表示从顶点n1指向顶点n2的有向边。
- 把无向图中的度数输出改成入度和出度输出
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define N (100 + 5)
#define INF 0x3f3f3f3f//定义INF为一个十六进制无穷大常量typedef char VexType; //顶点为字符类型
typedef int EdgeType;//邻接矩阵类型为整型typedef struct {int n, m; //n个顶点,m条边VexType vex[N];//一维数组存放所有顶点的数据信息EdgeType edge[N][N];//邻接矩阵(二维数组存放图中所有顶点之间关系的信息)
} adjGraph;//1.邻接矩阵建图
adjGraph createGraph();
//2.输出图的信息(顶点、邻接矩阵)
void print(adjGraph g);
//3.输出图中每个顶点的度数
void printDegree(adjGraph g);int main()
{//1.建图adjGraph g = createGraph();//2.输出图的信息print(g);printDegree(g);return 0;
}adjGraph createGraph()//建图
{adjGraph g;memset(g.edge, 0, sizeof(g.edge));//内存设置函数--创建图的过程中,所有元素初始化为0// g.edge 邻接矩阵//sizeof(g.edge) 数组占用的总字节数scanf("%d%d", &g.n, &g.m);//输入顶点数和边数getchar();//吸收换行符//1.输入n个顶点for (int i = 0; i < g.n; i++) {scanf("%c ", &g.vex[i]);}//2.输入m条边,按照邻接矩阵存图for (int i = 0; i < g.m; i++) {char v1, v2;scanf("\n%c %c", &v1, &v2);//读入当前边的2个顶点int n1 = v1 - 'A', n2 = v2 - 'A';//将顶点字符转换为对应的数组索引。// 假设顶点标签是大写字母'A'、'B'、'C'等,通过将其减去字符'A'的ASCII码值// 可以得到对应的数组索引(0、1、2等)。 g.edge[n1][n2] = 1;//有向图,邻接矩阵对应的n1行n2列赋值为1//将对应的邻接矩阵元素设置为1,表示图中对应的顶点之间存在一条边。}return g;
}void print(adjGraph g)
{printf("图有%d个顶点,%d条边\n", g.n, g.m);printf("图的顶点是:");for (int i = 0; i < g.n; i++) {printf("%c ", g.vex[i]);}printf("\n图的邻接矩阵是:\n");for (int i = 0; i < g.n; i++) {for (int j = 0; j < g.n; j++) {printf("%4d", g.edge[i][j]);}printf("\n");}
}void printDegree(adjGraph g)
{printf("图中每个顶点的入度是:\n");for (int i = 0; i < g.n; i++) {int indegree = 0;for (int j = 0; j < g.n; j++) {if (g.edge[j][i] == 1) {indegree++;}}printf("%c: %d \n", g.vex[i], indegree);}printf("图中每个顶点的出度是:\n");for (int i = 0; i < g.n; i++) {int outdegree = 0;for (int j = 0; j < g.n; j++) {if (g.edge[i][j] == 1) {outdegree++;}}printf("%c: %d \n", g.vex[i], outdegree);}}
测试样例:
**有向带权图邻接矩阵建图和度数输出(含完整代码)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define N (100 + 5)
#define INF 0x3f3f3f3f//定义INF为一个十六进制无穷大常量typedef char VexType; //顶点为字符类型
typedef int EdgeType;//邻接矩阵类型为整型typedef struct {int n, m; //n个顶点,m条边VexType vex[N];//一维数组存放所有顶点的数据信息EdgeType edge[N][N];//邻接矩阵(二维数组存放图中所有顶点之间关系的信息)
} adjGraph;//1.邻接矩阵建图
adjGraph createGraph();
//2.输出图的信息(顶点、邻接矩阵)
void print(adjGraph g);
//3.输出图中每个顶点的度数
void printDegree(adjGraph g);int main()
{//1.建图adjGraph g = createGraph();//2.输出图的信息print(g);printDegree(g);return 0;
}adjGraph createGraph()//建图
{adjGraph g;memset(g.edge, 0, sizeof(g.edge));//内存设置函数--创建图的过程中,所有元素初始化为0// g.edge 邻接矩阵//sizeof(g.edge) 数组占用的总字节数scanf("%d%d", &g.n, &g.m);//输入顶点数和边数getchar();//吸收换行符//1.输入n个顶点for (int i = 0; i < g.n; i++) {scanf("%c ", &g.vex[i]);}//2.输入m条边,按照邻接矩阵存图 // 将邻接矩阵初始化为INFfor (int i = 0; i < g.m; i++) {for (int j = 0; j < g.m; j++) {g.edge[i][j] = INF;}}for (int i = 0; i < g.m; i++) {char v1, v2;int weight;scanf("\n%c %d %c", &v1, &weight, &v2);//读入当前边的2个顶点int n1 = v1 - 'A', n2 = v2 - 'A';//将顶点字符转换为对应的数组索引。// 假设顶点标签是大写字母'A'、'B'、'C'等,通过将其减去字符'A'的ASCII码值// 可以得到对应的数组索引(0、1、2等)。if (n1 == n2) {g.edge[n1][n2] = 0;}else {g.edge[n1][n2] = weight;g.edge[n2][n1] = INF; // 反方向的边权值设置为INF}}return g;
}void print(adjGraph g)
{printf("图有%d个顶点,%d条边\n", g.n, g.m);printf("图的顶点是:");for (int i = 0; i < g.n; i++) {printf("%c ", g.vex[i]);}printf("\n图的邻接矩阵是:\n");for (int i = 0; i < g.n; i++) {for (int j = 0; j < g.n; j++) {if (i == j) printf("0 ");else if (g.edge[i][j] == INF){printf("INF ");}else {printf("%-4d", g.edge[i][j]);}}printf("\n");}
}void printDegree(adjGraph g)
{printf("图中每个顶点的入度是:\n");for (int i = 0; i < g.n; i++) {int indegree = 0;for (int j = 0; j < g.n; j++) {if (g.edge[j][i] != 0 && g.edge[j][i] != INF) {indegree++;}}printf("%c: %d \n", g.vex[i], indegree);}printf("图中每个顶点的出度是:\n");for (int i = 0; i < g.n; i++) {int outdegree = 0;for (int j = 0; j < g.n; j++) {if (g.edge[i][j] != 0&& g.edge[i][j] != INF) {outdegree++;}}printf("%c: %d \n", g.vex[i], outdegree);}}
样例:
2、邻接表存储方法
对每一个顶点建立一个单链表,将同一个顶点发出的边链接在一个称为边链表的单链表中。
头插法:
五、图的遍历
六、最小生成树
七、最短路径问题
八、AOV网与拓扑排序
九、AOE网与关键路径
相关文章:

数据结构--图
树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中,数据元素之间的关系是任意的。 一、图…...

AXure的情景交互
目录 导语: 1.erp多样性登录界面 2.主页跳转 3.省级联动编辑 4. 下拉加载 导语: Axure是一种流行的原型设计工具,可以用来创建网站和应用程序的交互原型。通过Axure,设计师可以创建情景交互,以展示用户与系统的交…...

数据库操作习题12.12
考虑如下的人员数据,其中加下划线的是主码,数据库模式由四个关系组成: employee (empname, street, city) works (empname, compname, salary) company(id, compname, city) managers (empname, mgrname) 其中 关系 employee 给出人员的基本信息,包括人员…...
Redis之INCR命令,通常用于统计网站访问量,文章访问量,分布式锁
前言 Redis的INCR命令用于将键的值增加1。如果键不存在,则会先将键的值设置为0,然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作,可以用于实现多种场景,比如统计网站访问量、文章访问量、分布式锁等。 一、Redis键之…...
window运行celery报错
报错信息 Traceback (most recent call last): File "c:\program files\python36\lib\site-packages\billiard\pool.py", line 359, in workloop result (True, prepare_result(fun(*args, **kwargs))) File "c:\program files\python36\lib\site-packages\ce…...

玩转Docker(五):网络
文章目录 〇、关于linux系统网络一、none网络二、host网络三、bridge网络一个问题:为什么在主机上仍可以通过localhost:port访问到容器中的服务? 四、user-defined网络 Docker安装时会自动在host上创建三个网络,我们可用docker network ls命令…...

选择合适教育管理软件:必须考虑的10个关键问题
随着教育行业的迅速数字化,学校要能够提供最新的管理和教育方法。大家逐渐意识到技术让运营变得更容易、更有效率。 不过首先我们需要找到一个能满足需求的应用程序。面对众多的选择,你该如何选择一个合适的平台呢?当然,没有人想…...
前端不同架构的分层设计
1. 架构设计分层: (1). 系统架构: ①. 应用场景:a. 应用在整个系统内,如与后台服务如何通信,与第三方系统如何集成.②. 前提条件:a. 了解前端系统与其它系统间的关系,包括业务关系和协作机制.b. 了解后端系统,需要规定与后台数据传递的机制,包括:(1). api设计规范(2). 访问授…...
android系统镜像文件
boot.img:这是包含内核和设备树(Device Tree)的镜像文件。它被引导加载程序(bootloader)加载以启动系统,并负责将控制权转交给内核。 dtbo.img:这是设备树增量编译(Device Tree Ove…...

相位的重要性
在过去的几年中,相干信号和图像处理尖端技术的开发和应用有了显著的增长。相干处理的特点是使用一个称为相位的单一量[1]。相比之下,非相干处理只利用信号幅度或强度。需要进行相干处理的例子包括合成孔径雷达(SAR)、合成孔径声纳…...
(三十三)补充Python经典面试题(吸收高级编程特性)
第一题: def func(a, b[]): pass一、上题讲解: 这个函数定义有一个默认参数b,它的默认值是一个空列表[]。这道面试题涉及到Python中函数参数默认值的一些重要概念和陷阱。 首先,当你调用这个函数时,如果不传递参数b…...

SQL进阶理论篇(四):索引的结构原理(B树与B+树)
文章目录 简介如何评价索引的数据结构设计好坏二叉树的局限性什么是B树什么是B树总结参考文献 简介 我们在上一节中说过,索引其实是一种数据结构,那它到底是一种什么样的数据结构呢?本节将简单介绍一下几个问题: 什么样的数据结…...

springMVC-模型数据的处理
一、数据放入到request域当中 1、把获取的数据放入request域中, 方便在跳转页面去显示 <a>添加主人信息</a> <form action"vote/vote04" method"post" >主人id:<input type"text" name"id&q…...

计算机组成原理-微指令的设计与微程序控制单元的设计
文章目录 微指令的设计微指令的格式微指令的编码方式水平型微指令的操作控制部分的编码方式直接编码字段直接编码例题字段间接编码方式 微指令的地址形成方式例题小结 微程序控制单元的设计微程序设计分类硬布线与微程序的比较 微指令的设计 微指令的格式 水平型微指令的操作…...

PyTorch机器学习与深度学习
近年来,随着AlphaGo、无人驾驶汽车、医学影像智慧辅助诊疗、ImageNet竞赛等热点事件的发生,人工智能迎来了新一轮的发展浪潮。尤其是深度学习技术,在许多行业都取得了颠覆性的成果。另外,近年来,Pytorch深度学习框架受…...

羊奶vs牛奶,羊大师告诉你谁是更营养的选择?
羊奶vs牛奶,羊大师告诉你谁是更营养的选择? 羊奶和牛奶是两种常见的乳制品,它们不仅在口味上有所差异,而且在营养成分方面也存在一些差异。本文将对羊奶和牛奶的营养成分进行全面对比,旨在帮助读者更好地了解这两种乳…...

机器学习之线性回归(Linear Regression)
概念 线性回归(Linear Regression)是机器学习中的一种基本的监督学习算法,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。它假设输入变量与输出变量之间存在线性关系,并试图找到最佳拟合线来描述这种关系。 在简单线性回归中,只涉及两个变量:一个是自变量…...

ChatGPT与ArcGIS PRO 如何结合,打造一个全新的工作流程
在地学领域,ArcGIS几乎成为了每位科研工作者作图、数据分析的必备工具,而ArcGIS Pro3除了良好地继承了ArcMap强大的数据管理、制图、空间分析等能力,还具有二三维融合、大数据、矢量切片制作及发布、任务工作流、时空立方体等特色功能&#x…...

【深度学习】对比学习的损失函数
前言 对比学习损失(Contrastive Learning Loss)是一种用于自监督学习的损失函数。它侧重于学习一个特征空间,其中相似的样本被拉近,而不相似的样本被推远。在二分类任务中,对比学习损失可以用来学习区分正负样本的特征…...

哈夫曼解码
【问题描述】 给定一组字符的Huffman编码表(从标准输入读取),给定一个用该编码表进行编码的Huffman编码文件(存在当前目录下的in.txt中),编写程序对Huffman编码文件进行解码。 例如给定的一组字符的Huffm…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...