模板代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int idx
int h[N], e[N], ne[N], w[N;]
// 注意这里要初始化 head 为 -1
memset(h, 0xff, sizeof(h));
// 加入有向边 (x, y),权值为 z
void add(int x, int y, int z) {
    // 真实数据
    e[idx] = y, w[idx] = z;
    // 在表头 x 处插入
    ne[idx] = h[x], h[x] = idx++;
}
// 访问从 x 出发的所有边,注意这里终止条件的不同
for (int i = h[x]; ~i; i = ne[i]) {//~i表示i不等于-1
    int y = e[i], z = w[i];
}

邻接表构成的数据结构图示

image.png 注意这里有个容易搞混的点,每条链表上挂的是从对应头结点的所有出边,而不是图中的一条路径。

参考

邻接表代码 邻接表解释 y总数据结构笔记一