特殊“邻接表”建图方法

图的邻接表存储法:高效节省空间的图表示方法 在图论中,图是一种常见的数据结构,用于表示各种实际问题中的关系。图的存储方法有多种,其中邻接表存储法是一种常用且高效的表示方法。本文将详细介绍图的邻接表存储法及其实现原理,同时分析其优缺点,并提供实际应用示例,以帮助读者深入了解和应用这一图表示方法。// 定义图的边结构// 与边相连的当前此顶点的索引Edge* next;// 指向下一个邻接边的指针} Edge;// 定义图的顶点结构// 顶点数据// 指向第一个邻接边的指针} Vertex;// 定义图的邻接表结构。 阅读详情

(此文借鉴 dollarzhaole 的 《邻接表建图方法及代码》 )

说明:

        建立有向图(稍加更改可变为无向图);

        第一行输入n 表示边数;

        随后n行输入a, b, c 分别表示边的起点, 终点, 权值;


输入示例:

 5

 3 4 6
 3 7 8
 1 3 6
 2 4 7
 3 5 1


图示例:

              

方法:

        利用数组和结构体模拟边与边的关系, 极大的节省空间和时间;


图示解析:


代码:

1.有向图:

#include <stdio.h>
#include <string.h>
#define N 100

struct Edge{		//此结构体表示边
	int start;		//边起点
	int end;		//边终点
	int weight;		//权值
	int next;		//下一个与start有关的边
};

int first[N];		//存储以下标为起点的边的(最后)位置
Edge e[N] ;			//存储边的具体信息

void Build_Graph()	//建图
{
	int edges;		//边数
	memset(first, -1, sizeof(first));		//-1表示该起点不存在连边
	scanf("%d", &edges);
	for(int i = 0; i < edges; i ++){
		scanf("%d%d%d", &e[i].start, &e[i].end, &e[i].weight);		//输入节点信息
		e[i].next = first[e[i].start];
		first[e[i].start] = i;
		/* first数组存储的是"最新的"以下标i为起点的边在e数组中的位置, 所以有新
		数据都要先修改过first, 类似单链表的头插法;
		   但在更改first[i]的值前, 应先修改边的next值为first[i]的当前值,犹如单
		链表头插前要修改 newnode ->next = head ->next;	*/
	}
}

void Print_Graph()
{
	 for(int i = 1; i < 10; i ++)							//输出图 10暂且表示顶点最大值
     {
		 if(first[i] == -1) continue;						//该起点没边
         printf("以%d为起点的所有边的信息:\n", i); 
         for(int j = first[i]; j != -1; j = e[j].next)		//遍历以j为起点的所有边的信息 
            printf("%d %d %d\n", e[j].start, e[j].end, e[j].weight);
		 printf("\n");
     }
}

int main()
{
	Build_Graph();
	Print_Graph();

	return 0;
}

2.无向图:

#include <stdio.h>
#include <string.h>
#define N 100

struct Edge{		//此结构体表示边
	int start;		//边起点
	int end;		//边终点
	int weight;		//权值
	int next;		//下一个与start有关的边
};

int first[N];		//存储以下标为起点的边的(最后)位置
Edge e[N] ;			//存储边的具体信息

void Build_Graph()	//建图
{
	int edges;		//边数(关系数)
	memset(first, -1, sizeof(first));		//-1表示该起点不存在连边
	scanf("%d", &edges);
	for(int i = 0; i < edges * 2; i ++){
		scanf("%d%d%d", &e[i].start, &e[i].end, &e[i].weight);		//输入节点信息
		e[i].next = first[e[i].start];
		first[e[i].start] = i;

		i ++;														//无向图增加代码
		e[i].start = e[i - 1].end;
		e[i].end = e[i - 1].start;
		e[i].weight = e[i - 1].weight;
		e[i].next = first[e[i].start];
		first[e[i].start] = i;

		/* first数组存储的是"最新的"以下标i为起点的边在e数组中的位置, 所以有新
		数据都要先修改过first, 类似单链表的头插法;
		   但在更改first[i]的值前, 应先修改边的next值为first[i]的当前值,犹如单
		链表头插前要修改 newnode ->next = head ->next;	*/
	}
}

void Print_Graph()
{
	 for(int i = 1; i < 10; i ++)	//输出图 10暂且表示顶点最大值
     {
		 if(first[i] == -1) continue;	//该起点没边
         printf("以%d为起点的所有边的信息:\n", i); 
         for(int j = first[i]; j != -1; j = e[j].next)		//遍历以j为起点的所有边的信息 
            printf("%d %d %d\n", e[j].start, e[j].end, e[j].weight);
		 printf("\n");
     }
}

int main()
{
	Build_Graph();
	Print_Graph();

	return 0;
}


数据结构知识整理 - 构造图(邻接表和邻接矩阵) 主要内容 图的定义 图的存储结构 邻接矩阵 邻接表 对比邻接矩阵与邻接表 十字链表 邻接多重表   前言 在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继; 在树形结构中,数据元素之间有明显的层次关系,并且每一层中的数据元素可能和下一层的多个元素(子结点)相关,但只能和上一层的一个元素(父结点)相关; 在图结构中,结点之间的关系是任意的,可以说... 阅读详情

相关推荐

【数据结构笔记20】图的定义,图的表示:邻接矩阵与邻接表

表示图的方法有很多,取决于具体问题,这里只举邻接矩阵和邻接表的例子。

记录学习痕迹的公众号:Piper蛋窝 1903

图:邻接表法创建图

邻接表法创建图

qq_46785243的博客 3717

以邻接表创建图实现图的基本操作

以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。

邻接表建图

邻接表建图 邻接表的思想: 将同一个起点的边放在一个链表里面,也就是说对于一个有n个节点的图,我们需要维护n个这样节点的链表; 用n个指针,分别指向以节点i为起点的第一条边touzhizhen,也可以理解成(1)中所述的链表的头指针。 参考实现1(指针方式) struct edge { int to; edge *next; }; edge *head[n]; void addEdge(...

han_yiyang的博客 1211

解决mmdet3d安装中因PyTorch高版本引发的THC.h缺失问题

本文详细分析了在安装mmdet3d时,因PyTorch版本过高导致THC.h头文件缺失的常见报错问题。文章指出该错误的本质是PyTorch 1.7+版本废弃了旧API,与老版本C++扩展代码不兼容。提供了两种核心解决方案:一是降级PyTorch至1.6及以下版本;二是修改源码,将THC.h引用替换为ATen/cuda等新头文件,并给出了具体的代码修改示例和排查技巧。

weixin_29085151的博客 380

BUUCTF reverse题解汇总

BUUCTF平台刷题过程中做的一些逆向题解的总结归类

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1万+

图的建立(邻接表)

图建立之邻接表 图的建立是需要通过传入图对应的信息才能建立的,而邻接矩阵和邻接表就是这个作用。 邻接表是对邻结矩阵的改进,在邻接矩阵中才用一个一维数组记录顶点,一个二维数组记录顶点所对应的边,如果当图中每个顶点之间连线很少的情况下,同样要依次遍历二维数组中的该顶点与其他顶点的关系来确定边,导致效率低下。 而邻接表则是一个结构体指针数组,该结构体又是一个链表的头结点,即这个数组中只记录了该结点已连接...

weixin_42889383的博客 5429

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 594

数据结构--图的创建之邻接表

思绪不断阻挡着回忆播放,盲目的追寻仍然空空荡荡,灰蒙蒙的夜晚睡意又不知躲到哪去,一转身孤单已躺在身旁。 算法中也写过一篇关于建图的方法的博客,点这里。 邻接矩阵比较好理解,这里就不记录了,主要是邻接表,比较难理解, 邻接表存储类型定义: typedef struct ANode { int adjvex; //该边的终点编号 struct ANod...

0k-ok 1478

Verilog与综合:数字逻辑的代码化革命及其未来挑战

本文深入探讨Verilog硬件描述语言与逻辑综合技术在数字芯片设计中的革命性作用。Verilog实现了数字逻辑的代码化描述,而综合技术则将其自动转换为门级网表,大幅提升设计效率。文章重点分析了在先进工艺节点下面临的时序、功耗和物理效应等挑战,并展望了AI驱动综合优化的未来发展方向。

postgres8guard的博客 802

如何实现VMware虚拟机上的ubuntu与windows主机共享文件夹

windows主机部分   在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 接下来右键属性,操作如下系列图所示: 在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 成功修改后,显示如下界面: VMware部分 ubuntu在关机状态下,点击“编辑虚拟机设置” 接下来,开启ubuntu系统,在终端输入: ·· vmware-hgfsclient ·· 将会显示如下画面,但是此时你可能找不到 /mnt/hgfs 这个路径,如果找不到该路径,则需要在虚拟

Mr.Sliver的博客 8217

【C++】邻接表

通常用vector其中maxn是节点数量的最大值,adj[v]表示节点v的所有邻居组成的列表。

Dust的博客 1295

2022-04-06 RK3566 上调试百兆以太网卡YT8512C 调试记录

一、原理图 二、dts &gmac1_clkin{ clock-frequency = <50000000>; status = "okay"; }; &gmac1 { phy-mode = "rmii"; clock_in_out = "input"; snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; snps,reset-active-low; sn...

海月汐辰 1万+

特殊的邻接表——立方体邻接表

特殊的邻接表——立方体邻接表:关于链接表的一些特殊情况的考虑   我们在学习图的时候,都知道常用的保存图的方法有邻接矩阵和邻接表。当图中的边的数量相对于顶点的数量较少是,邻接矩阵中会出现许多0值,即形成了稀疏矩阵。这个时候用邻接表来储存图就可以大大减少储存所需的空间,也即是对矩阵进行了“压缩”。   邻接表的本质是一种链式储存结构,它保存的是顶点间的邻接关系,也就是只考虑邻接矩阵中的非零元素。...

weixin_30751947的博客 221

DFI协议时序

参数名称典型值应用场景关键影响tcmd_lat1-2个时钟周期命令与地址锁存同步地址错误风险tphy_wrlat1-2个时钟周期写操作响应速度写带宽与延迟2-3个时钟周期写操作端到端延迟系统吞吐量1-2个时钟周期连续写命令间隔信号干扰与资源冲突tphy_rdlat1-2个时钟周期读操作响应速度读带宽与延迟trddata_en由CL决定(如0.41 ns)读数据返回时间系统延迟10-20 ps写数据与命令对齐数据丢失风险<1 µs低功耗模式切换。

qq_43134430的博客 5103

6、 实时家禽健康识别与疾病检测系统的深入解析

本文深入解析了一种基于物联网的实时家禽健康识别与疾病检测系统,结合图像分析和音频分析技术,能够有效识别病鸡并防止疾病传播。文章详细介绍了系统的测试环境、数据采集与预处理方法、图像与音频分析流程,并对系统性能进行了全面评估。最后提出了未来改进方向,包括多模态融合、深度学习应用及实时性优化等。

weixin_28840811的博客 186

邻接表实现有向图BFS、DFS、拓扑排序

图的大家族 常用图的存储结构有两种:邻接矩阵,邻接表。一个数组,一个链表,可见复杂的数据结构是建立在基础结构之上的,在这里选择邻接表存储,边比较少时省空间。 图按照有无方向,有无权重,分为四类 无向无权:无向图 无向有权:无向网 有向无权:有向图 有向有权:有向网 可见带有权重称为网,否则称为图。 图可以看成边权均为1,所以是特殊网。因此掌握了网,也就顺带会了图 由于无向图均有对称性,所以大...

努力做个书呆儿 5479

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构与算法-图论 邻接表【十五】

链式存储 (链式表示)     上一话说的是邻接矩阵方式去存储图,这一话用链表去存储图 链式表表示法----【邻接表/ 邻接多重表 / 十字链表】 邻接表     将所有的顶点数据仍然存放在一维数组内。     这个一维数组比较特殊,顶点数组的每个元素都指向一个邻接点单链表。 咱们以上一个邻接矩阵用到的一个有向图和无向图为例: 无向图 的邻接表 第一个无向图的邻接表可以这样表示: A 邻接于 B-> C-> NULL B 邻接于 A -> C ->

Riptide 6683

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java有向图邻接表详解:建图、遍历、拓扑排序与避坑指南

有向图是依赖关系建模的核心数据结构,邻接表作为其经典存储方案,以O(V+E)空间高效支撑稀疏图场景。理解邻接表的构建原理与遍历机制,是掌握图算法底层能力的关键。技术选型上,邻接矩阵适合稠密图,而邻接表凭借更低的存储开销和自然的遍历方式,在任务编排、课程依赖、SQL血缘追踪等真实业务中广受青睐。围绕邻接表,深度优先搜索、广度优先搜索与基于入度的拓扑排序,构成了解决工程调度问题的基本工具箱。Java实现时需关注可变对象键、遍历删除与重复边/自环等陷阱,这些细节直接影响算法正确性。课程排程这一经典场景完整展示了从

weixin_33508411的博客 202

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

有向图的邻接表实现(Java版)

在无向图中,边没有方向性,就相当于一条公路,你可以来我这,我也可以去你那。然而,现实世界里,有一些通道是单向的,只允许一个方向通过。比如某些工作流程,你必须完成工作A,才能进行工作B。这时候,我们需要用有向边,来表达这些数据。当然,无向图可以看成特殊的有向图。在一张有向图中,可能会有2种情况。第一,顶点存储一些信息,比如用户名、密码、用户作品等等。第二,边存储一些信息,比如用户与用户的亲密程度、距离、长度等等。

weixin_62411896的博客 694

特殊路径统计(C++)

C++求解特殊路径,主要考察图的建立和遍历。

CXR_XC的博客 1749

【数据结构】图的存储结构:邻接表

图的存储结构 由于图的任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序存储结构,但我们可以用二维数组(矩阵)来表示元素之间的关系——邻接矩阵。除此之外还有链式存储结构,包括邻接表、十字链表和邻接多重表。其中邻接矩阵和邻接表最常用。 邻接表 邻接表(Adjacency List)是图的一种链式结构。图中有多少个顶点,就有多少个单链表...

春雪阁 3518

图解邻接表:从数据结构小白到能手,5分钟搞懂图的链式存储

本文通过图解和Python代码实战,详细解析了图的邻接表存储结构。邻接表通过‘顶点数组+边链表’的组合,高效存储稀疏图,相比邻接矩阵大幅节省空间。文章阐述了其核心组成、无向/有向图处理差异、带权图实现,并分析了其性能优势与适用场景,帮助读者快速掌握这一关键数据结构。

day7的博客 572

邻接表数组模拟

这样的语句,那么这是什么意思呢,就是当前要插入的这个结点,对应的图上的编号就是 9 ,那是谁指向这个对应图上编号 9 的结点,这个结点又指向谁呢,其实不难发现, h[7] 指向这个结点,这个结点指向原本编号为 7 的头队列指向的第一个结点。刚在Acwing上看完Y总的教学,其中在模拟图的时候讲了数组模拟邻接表的方法,用了三个数组,一开始笨人蒙蔽了N久,后面手写推了一遍,理了理过程,现在才理解了,写个文章记个笔记,相信应该也有其他小伙伴第一次看到的时候挺蒙蔽,希望这篇文章能帮到你。

Mickalls的博客 351

使用邻接表 表示图

到这里已经差不多够了,但是有一个关键的点就是这里只保存了边的编号以及这个边的下一条边(这个链表存储的是某个节点的所有边,所以这个”下一条“的意思并不是真的图中的下一条,仅仅是某个节点的所有的边组成的链表的下一条),没有保存这个边的另一头是哪个节点,所以虽然知道了某个节点的所有边的编号但是并不知道这个节点通过这个边可以去哪里,所以还需要一个数组来存储编号为i的边的终点是哪个节点,这样才能将整个图构建出来。另外,有的图的边是有权重的,所以可能还会在多一个数组w来存储编号为i的边的权重。

蓝胖子的博客 488

树状结构数据的数据库表设计及使用 - 1. 邻接表

树状结构或层次结构的数据在企业应用里非常常见,例如公司的组织架构、文档库的目录结构、仓库的库位组织以及物件的分类等等。通常的树状图是一种数据结构。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。在设计树状结构的数据库表的时候,大部分开发者会下意识的选择邻

不吃_花椒的博客 7834
上一篇: NYOJ-364 田忌赛马(贪心)
下一篇: NYOJ-38 布线问题(图论,最小生成树,Prime)
tbl00c
博客等级 码龄13年 21粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值