📅  最后修改于: 2023-12-03 15:00:03.093000             🧑  作者: Mango
前推向量(forward star)是一种常见的图存储方式,可以高效地存储和处理稀疏图。本文介绍了如何用 C++ 实现前推向量,并提供了代码片段以供参考。
前推向量通常用于存储邻接表表示的稀疏图。它将每个顶点的邻居顶点编号按照升序排列,同时将每个顶点的邻居顶点编号和对应的边权重(如果有)分别存储在两个不同的数组里。具体来说,我们可以定义两个数组:
例如,下面是一个以前推向量表示的稀疏图:
0 --[2]-- 1 --[3]-- 2
\ |
\--[1]--/
对应的 head 和 neighbor 数组为:
int head[3] = {0, 2, 3};
pair<int, int> neighbor[3] = {{1, 2}, {0, 2}, {1, 3}};
这里采用 C++ 中的 pair 类型来同时存储邻居顶点编号和边权重,具体可以根据实际情况调整。
下面是一个简单的以前推向量表示稀疏图的 C++ 代码片段:
#include <iostream>
#include <vector>
using namespace std;
const int N = 1005;
int head[N], nxt[N], ver[N], w[N], idx = 0; // head 数组和邻接表中的 ver, nxt, w 数组
void add(int x, int y, int z) {
ver[++idx] = y; // 邻接表中加入一个边 (x, y, z)
w[idx] = z;
nxt[idx] = head[x];
head[x] = idx;
}
int main() {
int n, m; // n 个点,m 条边
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
int x, y, z;
cin >> x >> y >> z;
add(x, y, z);
}
// 输出邻接表
for (int i = 1; i <= n; ++i) {
cout << i << ": ";
for (int j = head[i]; j; j = nxt[j]) {
cout << ver[j] << " " << w[j] << "; ";
}
cout << endl;
}
return 0;
}
这里我们通过 ver 数组和 nxt 数组来存储前推向量,而 w 数组则可以存储每个边的边权重(如果有)。add 函数用于向邻接表中添加一条边,遍历邻接表时从 head 数组开始,然后沿着 nxt 数组一路向后遍历。
前推向量是一种存储稀疏图的高效方式,能够优化稀疏图的存储和处理。本文介绍了如何用 C++ 实现前推向量,并提供了代码片段以供参考。希望对大家有所帮助。