数据结构--图(更新ing~)

  树具有灵活性,并且存在许多不同的树的应用,但是就树本身而言有一定的局限性,树只能表示层次关系,比如父子关系。而其他的比如兄弟关系只能够间接表示。

推广---  图

图形结构中,数据元素之间的关系是任意的。

一、图的基本概念

二、图的分类

三、图的相关术语

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);}}

测试样例:

**有向带权图邻接矩阵建图和度数输出(含完整代码)

要注意有向图带权图中,含有权值的线路如 A 20 B ,反过来B到A就是 INF,不相连的两个顶点之间也是INF

#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、邻接表存储方法

  对每一个顶点建立一个单链表,将同一个顶点发出的边链接在一个称为边链表的单链表中。

头插法:

无向图中相连即放在链表里作为边结点(包含与该点相连的所有顶点)。

有向图按照方向选择结点作为边结点。‘’

五、图的遍历

1.深度优先遍历

2.广度优先遍历

六、最小生成树

      

1.克鲁斯卡尔方法

2.普里姆算法

七、最短路径问题

Q:对于对于给定的带权连通无向图,从某源点到图中各顶点的最短路径构成的生成树是否是该图的最小生成树??

不一定相同。

八、AOV网与拓扑排序

九、AOE网与关键路径

1、AOE网的定义

2、AOE网的特点

3、AOE网的存储方法

4、关键路径

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

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

相关文章

[PTA]分寝室

学校新建了宿舍楼&#xff0c;共有 n 间寝室。等待分配的学生中&#xff0c;有女生 位、男生 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去&#xff0c;最后不能有寝室留空。 现请你写程序完成寝室的自动分配。分配规则如下&#xff1a; 男女生不能混住&…

如何去掉视频中不想要的水印,分享几个视频去水印技巧给你

如何去掉视频中不想要的水印&#xff1f;视频中的水印往往会遮挡画面&#xff0c;降低观看体验。本文将为您介绍三种方法&#xff0c;帮助您轻松去除视频中的水印&#xff0c;以便更好地欣赏和分享视频内容。 视频去水印技巧一&#xff1a;使用水印云 是一款操作简便、功能强大…

【C语言初阶】数组

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作…

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

图片速览 OOD用于零样本 OOD 检测的 CLIPN:教 CLIP 说不

PAPERCODEhttps://arxiv.org/pdf/2308.12213v2.pdfhttps://github.com/xmed-lab/clipn 文章创新 以往由CLIP驱动的零样本OOD检测方法&#xff0c;只需要ID的类名&#xff0c;受到的关注较少。 本文提出了一种新的方法&#xff0c;即CLIP说“不”&#xff08;CLIPN&#xff09;…

计算机基础,以及实施运维工程师介绍

目录 一.实施&#xff0c;运维工程师介绍 1.什么是实施工程师&#xff1f; 实施工程师职责 2.什么是运维工程师&#xff1f; 运维工程师职责 3.实施运维需要的技术 数据库 操作系统 网络 服务器 软件 硬件 网络 二.计算机介绍 CPU 存储器 io 总线 主板 三.操…

计算机毕业设计—基于Koa+vue的高校宿舍管理系统宿舍可视化系统

项目介绍 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理压力&#xff…

你了解Redis中的跳跃表吗?

跳跃表的基本内容&#xff1a; 对于一个有序序列&#xff0c;链表相对于数组来说&#xff0c;删除和插入的效率要快很多&#xff0c;只需要改变指针的指向&#xff0c;但是在查找的时候&#xff0c;数组就要更占优势一些&#xff0c;可以随机访问&#xff0c;然而链表需要从头…

oracle与gbase8s迁移数据类型对照

声明&#xff1a;以下为笔者阅读gbase官方文档和oracle官方文档的理解&#xff0c;如有错误&#xff0c;敬请指正。oracle与gbase8s迁移数据类型对照及举例说明 最终结论&#xff1a;oracle与gbase8s数据类型对应关系关于单精度与双精度的区别关于定点与浮点定义的区别精度的定…

[报错已解决]得到一个不期待的值added_cond_kwargs,图生图和文生图的pipline是不同的

报错内容 得到一个不期待的值added_cond_kwargs 问题原因 对照下图&#xff0c;做测试unet_2d_condition.py里面UNet2dConditionModel类的forward输入 而StableDiffusionPipline&#xff08;文生图t2i&#xff09;的self.unet输入里面多了一个added_cond_kwargs需要写 从下图可…

函数torch.bincount( )的用法

torch.bincount()函数是PyTorch中的一个函数&#xff0c;用于计算一维整数张量中每个非负整数值出现的频次 函数的用法 &#xff1a; torch.bincount(input, weightsNone, minlength0) → Tensor 参数&#xff1a; input&#xff1a;输入的一维整数张量weights&#xff08;…

机器学习——支持向量机

目录 一、基于最大间隔分隔数据 二、寻找最大间隔 1. 最大间隔 2. 拉格朗日乘子法 3. 对偶问题 三、SMO高效优化算法 四、软间隔 五、SMO算法实现 1. 简化版SMO算法 2. 完整版SMO算法 3. 可视化决策结果 六、核函数 1. 线性不可分——高维可分 2. 核函数 …

设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

原型模式 原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型&#xff0c;创建新的对象。 原型模式是一种创建型设计模式&#xff0c;允许一个对象再创建另外一个可定制的对象&#xff0c;无需知道如何创建的细节。 工作原…

新年跨年烟花超酷炫合集【内含十八个烟花酷炫效果源码】

❤️以下展示为全部烟花特效效果 ❤️下方仅展示部分代码 ❤️源码获取见文末 🎀HTML5烟花喷泉 <style> * {padding:0;margin:0; } html,body {positi

清华提出ViLa,揭秘 GPT-4V 在机器人视觉规划中的潜力

人类在面对简洁的语言指令时&#xff0c;可以根据上下文进行一连串的操作。对于“拿一罐可乐”的指令&#xff0c;若可乐近在眼前&#xff0c;下意识的反应会是迅速去拿&#xff1b;而当没看到可乐时&#xff0c;人们会主动去冰箱或储物柜中寻找。这种自适应的能力源于对场景的…

软件测试人才稀缺!揭秘为什么你找不到软件测试工作?

最近后台很多粉丝给我留言&#xff1a; 2023年软件测试已经崩盘了吗&#xff0c;为什么都找不到工作了&#xff1f; 确实&#xff0c;今年经济大环境不好&#xff0c;企业也都在降本增效&#xff0c;如果技术能力还在被应届生竞争岗位的阶段&#xff0c;只会越来越难。 找不…

从零开始在Linux服务器配置并运行YOLO8+Web项目

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a; 神经网络&#xff08;随缘更新&#xff09; ✨特色…

『OPEN3D』1.5.4 动手实现点云八叉树(OctoTree)最近邻

本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html?spm=1001.2014.3001.5482 在二维和三维空间中,我们可以采用四叉树(Quad tree)和八叉树(Octree)这两种特定的数据结构来处理空间分割。这些树形结构可以看作是K-d树在不同维度下的扩展。…

SpringBoot的多环境开发

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

JS - 闭包(Closure)

目录 1&#xff0c;什么是闭包2&#xff0c;创建闭包3&#xff0c;如何销毁闭包2.1&#xff0c;自动创建的闭包2.2&#xff0c;手动创建的闭包 4&#xff0c;闭包的特点和使用场景3.1&#xff0c;特点3.2&#xff0c;使用场景避免全局变量污染函数柯里化 5&#xff0c;闭包经典…