【算法-图论】图的存储

【算法-图论】图的存储

在图论中,我们应该如何存储一个图?每种存图的方法有什么优点,有什么缺点?这篇文章将会让你找到答案

1. 邻接表

邻接表是由一个静态的数组套动态的数组构成的。我们都知道动态数组的空间会随着数组的大小进行改变,可长可短,还可以自动释放一些无需的闲置空间,而外面的静态数组也可能对于一些节点空间小,一些节点空间大

当我们定义了一个邻接矩阵 GGG 时,GiG_iGi 则表示从 iii 号节点经过一条边到达的节点所构成的集合,我们只要遍历集合,就相当于遍历了以 iii 号为起点的边

例如上面的这个有向图可以写成这样的邻接表
G0={2,4,5}G1={4,5}G2={3,4}G3=∅G4={5}G5=∅ G_0 = \{2, 4, 5\} \\ G_1 = \{4, 5\} \\ G_2 = \{3, 4\} \\ G_3 = \emptyset \\ G_4 = \{5\} \\ G_5 = \emptyset G0={2,4,5}G1={4,5}G2={3,4}G3=∅G4={5}G5=∅

此外,如果这个图是无向图,可以看成两个相连的节点互相连接

如果还想保存权值的话,就在里面的动态数组中套一个结构体,一个是要到的点,另一个是到那个点的边的权值

以下是对于有权值有向图的邻接表的代码

cpp 复制代码
const int V = 1005; // 点的数量

struct EdgeNode {
	int v, w; // 到的地方和权值
};

vector<EdgeNode> G[V];

void AddEdge (int u, int v, int w) {
	G[u].push_back({v, w});
}

2. 邻接矩阵

它使用的是要一个二维静态数组,Gu,vG_{u, v}Gu,v 表示从 uuu 到 vvv 是否有边链接,如果有边为 111,否则没边为 000。对于有权值的边而言,Gu,vG_{u, v}Gu,v表示为从 uuu 到 vvv 连接的边权,如果没边则 Gu,v=∞G_{u, v} = \inftyGu,v=∞,另外,Gi,i=0G_{i, i} = 0Gi,i=0

对于这个图,那么它的邻接矩阵就是:

011110100100100010110001101001000110\] \\begin{bmatrix} 0 \& 1 \& 1 \& 1 \& 1 \& 0 \\\\ 1 \& 0 \& 0 \& 1 \& 0 \& 0 \\\\ 1 \& 0 \& 0 \& 0 \& 1 \& 0 \\\\ 1 \& 1 \& 0 \& 0 \& 0 \& 1 \\\\ 1 \& 0 \& 1 \& 0 \& 0 \& 1 \\\\ 0 \& 0 \& 0 \& 1 \& 1 \& 0 \\\\ \\end{bmatrix} 011110100100100010110001101001000110 其中,我们不难发现:矩阵始终是个方阵,且大小为 ∣V∣2\|V\|\^2∣V∣2 这是有权值无向图的邻接矩阵的写法: ```cpp const int V = 1005; // 点的个数 int G[V][V]; // 邻接矩阵 void AddEdge (int u, int v, int w) { G[u][v] = G[v][u] = w; } int main () { memset(G, 0x3f, sizeof(G)); } ``` ### 3. 边表 边表,也叫做链式前向星,它使用一个大小 2∣E∣2\|E\|2∣E∣ 的一维数组 EdgeEdgeEdge 存储边,还有一个大小为 ∣V∣\|V\|∣V∣ 的数组 HeadHeadHead 表示头指针。其中,EdgeEdgeEdge 的每一个元素实际上存储了三个属性:边连接哪个点、边的权值和同样以这个边的起点作为起点的其他的边,用于遍历所有的边。HeadHeadHead 存储着应该从哪里开始遍历以某个点作为起点的所有点,作为遍历的开端。实际编程时,我们可以倒着连接 这是加边用的函数 ```cpp const int ARRMAX = 100005; struct GrephEdge { int v; // 去哪个点 int w; // 权值 int nxt; // 下一个边 } Edge[ARRMAX << 1]; int cnt; int Head[ARRMAX]; void AddEdge (int u, int v, int w) { // 插入以 u 为起点,v 为终点,权值为 w 的边 Edge[cnt] = {v, w, Head[u]}; // 边的增加 Head[u] = cnt++; // 改变头指针 } ```

相关推荐
Eloudy3 小时前
简明量子态密度矩阵理论知识点总结
算法·量子力学
点云SLAM3 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
算法_小学生4 小时前
支持向量机(SVM)完整解析:原理 + 推导 + 核方法 + 实战
算法·机器学习·支持向量机
iamlujingtao5 小时前
js多边形算法:获取多边形中心点,且必定在多边形内部
javascript·算法
算法_小学生5 小时前
逻辑回归(Logistic Regression)详解:从原理到实战一站式掌握
算法·机器学习·逻辑回归
DebugKitty5 小时前
C语言14-指针4-二维数组传参、指针数组传参、viod*指针
c语言·开发语言·算法·指针传参·void指针·数组指针传参
qystca5 小时前
MC0241防火墙
算法
charlie1145141916 小时前
设计自己的小传输协议 导论与概念
c++·笔记·qt·网络协议·设计·通信协议
行然梦实8 小时前
粒子群优化算法(Particle Swarm Optimization, PSO) 求解二维 Rastrigin 函数最小值问题
算法·机器学习·数学建模
XH华8 小时前
C语言第六章函数递归
c语言·开发语言·算法