C++ 邻接矩阵与链式前向星

本文介绍了C++中图的两种常见存储方式——邻接矩阵和链式前向星。邻接矩阵适用于稠密图,空间效率在数据较小或使用Floyd算法时较高,但可能会占用大量空间。链式前向星是一种更节省空间的存储方法,特别适合稀疏图,其结构包含多个链表,通过表头数组快速定位数据。

目录:

边的存储方法

邻接矩阵

链式前向星简介


边的存储方法:

        边的存储方法有:邻接矩阵,邻接表,数组模拟邻接表,链式前向星……

        当前主流的存储方法是:邻接矩阵 和 链式前向星

邻接矩阵:

        基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。

        在 数据较小 或 用 Floyd算法 时,常用邻接矩阵,邻接矩阵在稠密图中表现得效率尤为高。

        无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。

        邻接矩阵虽然简单,但是,邻接矩阵所需要的空间大小为n^{2},很多情况下时会爆空间的。

        给大家一张图:

【代码实现】

//假设有n个点,m条边,求1~n的最短路
### 不同图存储结构的特点及应用场景 #### 邻接矩阵特点及应用 邻接矩阵是一种二维数组表示方法,适用于稠密图。对于具有 \(n\) 个顶点的无向图而言,其大小为 \(n \times n\) 的布尔矩阵可以用来描述任意两个节点间是否存在边相连的情况[^1]。 优点在于查询两点之间是否有直接路径非常迅速;缺点则是当处理稀疏图时会浪费大量内存资源用于保存不存在的连接关系,并且增加或删除一条边的操作效率较低。 ```cpp // C++ code snippet for Adjacency Matrix representation of a graph. const int MAXN = 105; int adjMatrix[MAXN][MAXN]; void addEdge(int u, int v){ adjMatrix[u][v]=adjMatrix[v][u]=1; // For undirected graphs } ``` #### 邻接表(Adjacency List)特点及应用 采用一维数组加指针的方式构建列表来记录每一个结点所关联的所有其他结点的信息。相较于邻接矩阵来说更加节省空间,在大多数情况下能够更高效地完成增删操作以及遍历工作[^2]。 特别适合于表达稀疏网络中的数据结构形式,因为只需要占用实际存在的边数目的额外储存单元即可满足需求。 ```cpp // C++ code snippet for Adjacency List (Vector Implementation). vector<int> adjList[MAXN]; void addEdge(int u,int v){ adjList[u].push_back(v); adjList[v].push_back(u); // If the graph is undirected } ``` #### 链式前向星(Priority Star Chain)特点及应用 本质上是对传统邻接表的一种改进版本,通过预先分配好足够的连续内存块作为缓冲区以容纳所有的边信息并利用头插法依次填入每条边的具体情况从而达到快速定位的目的[^3]。 这种做法不仅保持了原有邻接表的优点——即良好的时空性能平衡特性外还进一步提高了访问速度,尤其在竞赛编程领域受到了广泛欢迎。不过初次接触可能会觉得难以掌握。 ```cpp // C++ code snippet for Priority Star Chain implementation. struct Edge { int to,w,next; } edge[MAXM*2]; int head[MAXN],tot=0; inline void addedge(int from ,int to ,int w ){ edge[++tot]=(Edge){to,w,head[from]}; head[from]=tot; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值