首页 > 其他分享 >图的存储

图的存储

时间:2024-02-08 20:13:53浏览次数:17  
标签:存储 指向 int ed nx 出边 hd

当给定一张图后,我们需要存储。下面有三种存储方法。

1. 邻接矩阵

直接用二维数组 \(g_{i,j}\) 来表示从结点 \(i\) 到结点 \(j\) 的距离。

空间复杂度为 \(\mathcal{O}(N^2)\)。

2. 邻接表

可以发现,邻接矩阵在存稀疏图时,有大量的空间浪费。此时可以使用邻接表存图。

邻接表就是对于每个结点,只记录它的出边。这样能快速访问一个点的所有出边,但不能快速访问一条指定的出边。

一般用 vector 实现。

空间复杂度为 \(\mathcal{O}(M)\)。

const int N=1e5+5;
struct EDGE{
	int v,w;
	EDGE(){}
	EDGE(int V,int W){
		v=V;w=W;
	}
};
vector<EDGE> g[N];

3. 链式前向星

将邻接表改用静态数组,就有了链式前向星。

邻接表存图的方式为每次加入边后,由最后一条边指向它。而链式前向星是由表头指向它,再由它指向原来的第一条边。

用 \(hd_u\) 表示结点 \(u\) 的出边中第一条边。每次加边后,用 \(cnt\) 表示新加的边的编号。每条边有三个参数:下一条边的编号、指向的点与边权。于是就有了以下结构体:

struct EDGE{
	int nx,to,vl;
	EDGE(){}
	EDGE(int NX,int TO,int VL){
		nx=NX;to=TO;vl=VL;
	}
	/*nx为下一条边的编号,to为指向的点,vl为边权*/
};

如果要增加一条由 \(u\) 指向 \(v\),边长为 \(w\) 的边时,只需要让 \(nx \leftarrow hd_u,to \leftarrow v,vl \leftarrow w\),这条边就存好了。接下来让 \(hd_u \leftarrow cnt\) 就大功告成了。此时 \(hd_u\) 指向了这条边,而这条边又指向了原来的 \(hd_u\),即原来的第一条边。

void add(int u,int v,int w){
	ed[++cnt].nx=hd[u];
	ed[cnt].to=v;
	ed[cnt].vl=w;
	hd[u]=cnt;
}

如果要遍历点 \(u\) 的所有出边,只需要先让 \(i \leftarrow hd_u\),此时 \(i\) 指向了 \(u\) 的第一条出边。接下来不断让 \(i\) 变为 \(ed_i \rightarrow nx\),即 \(u\) 出边的下一条边即可。

for(i=hd[u];i;i=ed[i].nx){
	v=ed[i].to;w=ed[i].vl;
//	这里遍历的是点u能到达的所有点,v是到达的点的编号,w是边权
}

空间复杂度为 \(\mathcal{O}(M)\),在稀疏图中效率很高。

例1 洛谷-B3643

本体思路:使用邻接矩阵和邻接表存图,还要对邻接表进行排序。

代码

标签:存储,指向,int,ed,nx,出边,hd
From: https://www.cnblogs.com/lrxmg139/p/18012092

相关文章

  • 第5章 用数据库存储数据
    第5章用数据库存储数据5.1MySQL数据库用CSV和Excel存储数据有两个优点:非开发人员也能看到数据,不需要额外的学习成本。使用方便,数据存储在文件里,复制到其他设备上可以直接查看。这种表格存储文件的形式适用于少量数据的情况,当记录很多、字段很多时,打开文件会非常慢,而......
  • 第 4章 用 CSV 和 Excel 存储数据
    第4章用CSV和Excel存储数据4.1用CSV文件存储数据CSV(Comma-SeparatedValues)其实就是纯文本,用逗号分隔值,可以分隔成多个单元格。CSV文件除了可以用普通的文本编辑工具打开,还能用Excel打开,但CSV和Excel有以下不同:所有值都是字符串类型。不支持设置字体颜色和样......
  • 如何实现Vuex本地存储
    在前端开发中,Vuex是一款非常强大的状态管理工具,但是默认情况下,Vuex的数据是存储在内存中的,刷新页面后数据将会丢失。这往往会导致用户在刷新页面后需要重新登录等繁琐的操作。本篇文章将教会您如何实现Vuex的本地存储,让您的应用程序能够在刷新页面后依然保持用户的状态和数据。一、......
  • bcdedit是Windows操作系统中的一个命令行工具,用于查看和修改启动配置数据(BCD)。启动配
    bcdedit是什么bcdedit是Windows操作系统中的一个命令行工具,用于查看和修改启动配置数据(BCD)。启动配置数据存储重要的启动信息,包括启动加载程序和启动设置。这个工具主要由高级用户、系统管理员和开发人员使用,以调整与系统启动相关的各种参数。为什么使用bcdedit修改启动设置......
  • MySQL存储引擎-InnoDB数据页
    MySQL存储引擎-InnoDB数据页MySQL一个数据页默认16kb,MySQL为了不同目的涉及了很多类型的数据页,如undo页、ChangeBuffer页等等。我们这里只关心存放数据的页,即索引(INDEX)页。一个数据页的存储空间大致被划分为7部分,分别为:1、FIleHeader 文件头 38字节2、PageHeader页面......
  • SAN和NAS存储
    SAN:是一种高速网络架构,用于连接存储设备(如磁盘阵列、磁带库)和服务器,实现存储资源的共享和管理,(如光纤通道、iSCSI、FCoE)连接存储设备和服务器,提供块级存储访问,具有高性能、可靠性和扩展性,适合大型企业和需要高性能、共享存储的应用场景,如虚拟化、数据库等。部署方式:(linux服务......
  • 实现流程可控的镜像下载和存储(一)
    基于https实现镜像所有相关元信息的获取在弱网环境下,下载镜像很慢且容易出错,基于这个原因需要开发更加可靠且支持断点续传的镜像下载程序由于DockerHub在国内无法访问,用自己的阿里云镜像加速替代来进行测试下面以下载linux/amd64的ubuntu22.04镜像为例Authentication例中的......
  • 云计算 - 对象存储服务OSS技术全解
    本文全面深入地探讨了对象存储服务(OSS)的核心技术、基础知识和高级功能。从媒体存储到数据备份,再到数据仓库与数据湖,我们不仅解析了OSS在各种应用场景下的关键角色,还深入讨论了其与机器学习、多媒体处理以及日志和监控等多个开发场景的结合。关注【TechLeadCloud】,分享互联网架......
  • 联系信息的存储
    之前说过平台的用户信息是集中存储的。和用户相关的联系信息,包括手机号、电子信箱等等如何存储?是否和用户信息一样集中存储?    经过几次反复,最终决定还是分布存储。理由如下:    基本信息是分布存储的,例如人力资源系统存储内部人员信息,供应商系统存储供应商人员信息。......
  • MySQL存储引擎-InnoDB行格式
    MySQL存储引擎-InnoDB行格式mysql作为一款主流的关系型数据库,是以记录为单位向表中插入数据的。目前为止,Innodb共支持COMPACT、REDUNDANT、DYNAMIC、和COMMPRESSED四种行格式。在MySQL5.7及以上版本,默认采用DYNAMIC格式。DYNAMIC与COMPACT格式基本一致,下文中我们会介绍区别。因......