266 字
1 分钟
树与图的存储

树与图的存储#

树是一种特殊的图,与图的存储方式相同。 对于无向图中的边(a,b),存储两条有向边a→b,b→aa\rightarrow b, b \rightarrow a。 因此我们可以只考虑有向图的存储。

  • 邻接矩阵 g[a][b] 存储边a→ba\rightarrow b
  • 邻接表
// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
int h[N], e[N], ne[N], idx;
// 另外可以使用栈把所有可开辟空间存储起来,然后每次 add 的时候就从栈顶取空间,删除则把空间加入栈中 一般来说只有大量删除的时候才使用栈式的空间开辟
// 添加一条边a->b
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
// 初始化
idx = 0;
memset(h, -1, sizeof h);

链式前向星的作用

  • i 的反向边是 i ^ 1
  • 有向图中 ii 是表示第 i+1i + 1 条插入的边,无向图中 ii 是第 i/2+1i / 2 + 1 条插入的边