特殊“邻接表”建图方法

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

【matlab】使用alexnet进行特征提取

1.下载alexnet工具箱 在命令栏输入alexnet,若不报错说明已经安装,若出现错误按照提示去下载工具箱; 下载地址:https://ww2.mathworks.cn/matlabcentral/fileexchange/59133-deep-learning-toolbox-model-for-alexnet-network (1)需要先注册(十分简单),登陆,下载; (2)下载完成之后,...

jingjingliang1995的博客 5845

【顾邦小讲堂】第二十四期 电源环路测试从入门到精髓:一文掌握环路测试原理与电压注入点选择依据

电源环路测试是评估开关电源、线性电源等闭环系统稳定性的核心手段,直接关系到电源的稳定性、输出精度、动态响应、抗干扰能力甚至可靠性

GBupupup的博客 2117

图的建立(邻接表)

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

weixin_42889383的博客 5429

PubMedBERT:生物医学NLP中的垂直领域预训练实践与性能突破

本文深入探讨了PubMedBERT在生物医学NLP领域的应用与性能突破。作为专为生物医学文本设计的预训练模型,PubMedBERT通过全词掩码策略和BLURB基准测试,显著提升了命名实体识别、关系抽取等任务的准确率。文章还提供了PubMedBERT的实战应用案例和代码示例,展示了其在医学文献检索和电子病历结构化中的卓越表现。

kite3的博客 285

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

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

0k-ok 1478

告别臃肿!保姆级教程:用NTLite深度精简Win10,打造你的专属纯净系统(附完整组件移除清单)

本文提供了一份详细的NTLite教程,帮助用户深度精简Windows10系统,移除冗余组件并优化性能。从准备工作到组件移除清单,再到系统配置优化和无人值守安装,逐步指导用户打造专属纯净系统。附完整组件移除清单和实战经验,确保系统稳定高效运行。

weixin_30945039的博客 859

方差分解分析变量筛选与显著性计算

冗余分析(redundancy analysis,RDA)是一种回归分析结合主成分分析的排序方法,也是多响应变量(multiresponse)回归分析的拓展。在进行VPA时,首先就要对这些环境因子进行一个分类,然后在约束其它类环境因子的情况下,对某一类环境因子进行排序分析,这种分析也成为偏分析,即partialRDA。在地球环境科学的实际应用中,可以基于VPA结果得出不同类型的环境因素(如何气候、土壤性质以及植物)对生物群落组成(如植被丰度,微生物群落)的解释程度。对于由或创建的排序对象,函数。

wlh2067的博客 2520

【C++】邻接表

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

Dust的博客 1295

十一、机器学习进阶知识:径向基神经网络(RBFNN)的实现(Python,附源码及数据集)

本文对径向基神经网络(RBFNN)的理论基础及建模步骤进行介绍,之后使用Python实现基于RBFNN的数据预测,通俗易懂,适合新手学习,附源码及实验数据集。

weixin_42051846的博客 1万+

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

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

weixin_30751947的博客 221

Python电商网站全站爬虫实战:以京东为例的数据采集与分析

随着电子商务的蓬勃发展,电商数据已成为市场研究、竞争分析和消费者行为研究的重要资源。本文详细介绍了如何使用Python最新技术栈构建一个高效的电商网站全站爬虫,以京东为例实现商品数据的自动化采集。文章涵盖了爬虫的法律与伦理考量、技术选型、反爬虫策略应对、分布式架构设计以及数据存储方案,并提供了完整的代码实现。本爬虫系统采用Scrapy-Redis分布式框架、Selenium动态渲染、智能代理轮换和机器学习验证码识别等先进技术,能够稳定高效地抓取京东全站商品数据,为电子商务研究提供数据支持。关键词。

2201_76125261的博客 414

提高RFID检测距离以及检测速度的方法总结

摘要:提高RFID检测距离需优化阅读器功率、标签灵敏度、天线设计及频段选择,同时减少环境干扰;提升检测速度则需改进防碰撞算法、增强并行处理能力、精简数据传输。实际应用需平衡两者关系,如物流仓储采用UHF频段、高增益天线和动态Q算法实现远距离高速读取,ETC系统则通过微波频段和高速调制实现超远距离快速识别。不同场景需针对性优化硬件配置和系统参数。

start_up_go的博客 292

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

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

努力做个书呆儿 5479

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

Riptide 6683

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

weixin_33508411的博客 202

老版QQ原生表情gif动态

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

有向图的邻接表实现(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、付费专栏及课程。

余额充值