特殊“邻接表”建图方法

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

普冉PY32F002B ADC内部参考电压VREFINT的误差补偿与低功耗优化实践

本文详细介绍了普冉PY32F002B单片机在锂电池供电场景下ADC内部参考电压VREFINT的误差补偿与低功耗优化实践。通过分析GPIO配置、分压电阻匹配、采样时间设置等硬件设计要点,结合实时测量VREFINT电压值和软件补偿算法,有效提升了ADC测量精度至5mV以内,并实现了分压电路功耗控制与采样频率优化,为低成本消费电子项目提供了完整的解决方案。

846

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 469

图的建立(邻接表)

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

weixin_42889383的博客 5429

PTA编程—币值转换

我对于这个题的主要思想就是把九位数分三块,对每块进行处理后,再合并。有了这个思想就开始写代码,后面就是哪有洞补哪,哪个测试用例没通过就对其特殊处理…。反正最后测试用例全通过了。 #include<iostream> #include <string> #include <algorithm> using namespace std; char a[10]={'a','b','c','d','e','f','g','h','i','j'}; //既然题目说了最多9位

uyo9ko的博客 991

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

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

0k-ok 1478

Redhawk-SC输入件配置中的5个常见错误及解决方法

本文针对Redhawk-SC功耗与可靠性签核工具,深入剖析了输入件配置中工艺文件错配、DEF文件路径、时序文件格式、电源网络模型及宏模型处理这5个最常见且棘手的错误。文章提供了资深工程师验证过的实战解决方案与检查清单,旨在帮助用户规避风险,提升配置效率与分析准确性,确保芯片签核流程的顺利进行。

earth的博客 233

[Python] -项目实战10- 用 Python 自动化批量重命名文件

本文介绍了使用Python实现文件批量重命名的技术方法。主要内容包括:1)使用os和pathlib模块进行基础文件操作;2)提供多种实用脚本示例,如添加序号、替换字符、添加时间戳等;3)进阶功能包括用户输入和错误处理;4)GUI工具实现方案;5)常见问题与优化建议。文章详细讲解了从简单到复杂的批量重命名实现方法,帮助读者快速掌握这一提高工作效率的技能。建议开发者注意路径处理、错误管理等细节,确保脚本稳健运行。

每日出拳老爷子的博客 815

【C++】邻接表

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

Dust的博客 1295

机器视觉应用工程师职位深度解析与面试指南

广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。

郑伟强dev的专栏 433

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

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

weixin_30751947的博客 221

基于深度学习的工业零件缺陷检测系统

工业零件缺陷检测系统摘要 本文介绍了一个基于深度学习的工业零件缺陷检测系统解决方案。该系统采用Faster R-CNN目标检测算法,结合PyTorch框架和OpenCV图像处理库,实现了对工业零件表面缺陷(如裂纹、划痕、凹坑等)的自动检测与定位。系统包含完整的开发流程:从数据采集与标注、数据增强预处理、模型构建与训练,到最终的评估与部署。相比传统机器视觉方法,该深度学习方案具有更强的特征表示能力和环境适应性,能够有效提升工业质检的准确率和效率。文章详细阐述了系统架构设计、实现细节和优化策略,并提供了完整的代

huanghm88的专栏 286

Yolov8轻量级网络:Ghostnet、G_ghost、Ghostnetv2家族大作战(一):华为Ghostnet,超越谷歌MobileNet | CVPR2020

Yolov8引入轻量级网络Ghostnet、G_ghost、Ghostnetv2等,减少最新的深度神经网络的计算成本,引入高效的神经网络结构。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2568

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

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

努力做个书呆儿 5479

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

Riptide 6683

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

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

weixin_33508411的博客 202

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

余额充值