有向图无环图的邻接矩阵按上三角,行优先压缩存储,请举例说明怎么进行压缩存储
时间: 2024-09-07 19:01:26 浏览: 115
无向图的邻接矩阵存储及输出
有向图无环图(DAG)的邻接矩阵按上三角,行优先压缩存储是一种用于节省存储空间的技巧,特别是在处理稀疏的有向图时非常有效。这种方法的核心思想是只存储有向图的上三角部分(包括对角线)的邻接信息,因为无环图的邻接矩阵是对称的,上三角的信息足以重建整个图。
具体步骤如下:
1. 创建一个一维数组 `adj` 用于存储压缩后的数据。
2. 初始化一个变量 `pos` 用于记录 `adj` 数组当前的存储位置。
3. 从上三角开始遍历邻接矩阵的每一个元素(不包括对角线上的元素),按行优先的顺序将非零元素(即存在边的元素)按顺序存储到 `adj` 数组中,并更新 `pos`。
4. 存储时,可以只记录目标顶点的索引,也可以记录边的权重(如果有权重的话)。
5. 最终,`adj` 数组和 `pos` 变量就足以表示这个有向图的上三角部分。
下面以一个具体的例子进行说明:
假设有一个有向图无环图的邻接矩阵如下:
```
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
```
这个矩阵表示有5个顶点,顶点间的有向边如下:
- 顶点1指向顶点2
- 顶点2指向顶点3
- 顶点3指向顶点4
- 顶点4指向顶点5
按照上三角,行优先的顺序,我们从顶点2开始(因为顶点1是第一个,它没有前驱),遍历矩阵的上三角部分,结果如下:
```
1 -> 2
2 -> 3
3 -> 4
4 -> 5
```
假设我们使用一个一维数组 `adj` 来存储这些边的信息,可以得到如下:
```
adj[0] = 2 // 顶点1指向顶点2
adj[1] = 3 // 顶点2指向顶点3
adj[2] = 4 // 顶点3指向顶点4
adj[3] = 5 // 顶点4指向顶点5
```
数组中的每个元素代表了原邻接矩阵中对应上三角的非零元素的列索引,数组的长度即为 `pos` 的值。
阅读全文