预备知识:数组模拟单链表
邻接表的概述
邻接表可以看做是多个单链表的组合
因为每个单链表都需要存储头结点的下标,所以使用数组h
数组e、数组ne、变量idx的用途详见文章数组模拟单链表
邻接表的应用——树的存储
为了存储树,为树的每个节点分别建立一个单链表,
单链表中的每个树节点即为该树节点直接连接的树节点。
x号树节点的单链表的头结点的下标为h[x],
由下标可以从数组e中得到当前单链表节点存储的树节点编号。
核心代码
int h[N], e[M], ne[M], idx; // 用于邻接表
bool st[N]; // 用于深搜dfs
void init() // 邻接表的初始化
{
memset(h, -1, sizeof h);
}
void add(int a, int b) // 在邻接表中添加由a向b的边
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx;
idx ++;
}
void dfs(int u) // 树的深搜
{
st[u] = true; // 在树中,编号为u的节点已被搜过
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if(!st[j])
dfs(j);
}
}
例题
图文对照