// N为点个数, M为边个数
int h[N], e[M], ne[M], idx;
void add(int a, int b) {
e[idx] = b; ne[idx] = h[a]; h[a] = idx ++;
}
// 遍历
// u表示编号为u的点
for(int i = h[u];i != -1;i = ne[i]) { // 其实遍历的是idx
int v = e[i]; // u所连结点的编号
// ...
}
// 初始化
memset(h, -1, sizeof h);
邻接表是为每个点都开一个单链表,表示与每个点相连接的点有哪些。 idx
为每条边的编号。 h[a]
表示编号为a的点与其他点连边的编号。 e[idx]
表示idx
这条边终点编号。 ne[idx]
表示idx这条边的下一条边的idx
。