数组模拟邻接矩阵存储图的理解
看到很多小伙伴对,数组模拟邻接矩阵不理解其意义,
我试着说下我的理解。
int h[N], e[M], ne[M], idx;
memset(h, -1, sizeof h);
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
我理解数组广义上是一种映射关系
h数组的映射关系是,点→最新添加的出边(因为是头插法)
e数组的映射关系是,入边→这条边指向的点
ne数组的映射关系是,边→下一个同样起点的邻边
idx 表示边的标号,每次用一条边就++,保证所有边的标号不一样,最后idx就代表有多少边。
e[idx] = b // idx 编号的边指向 b点;
ne[idx] = h[a] // idx 编号的边同样起点的邻边是 h[a];
h[a] = idx // a 点 指向 idx这条出边 (头插法)
idx // 边的编号,防止重复
这里面的-1 代表null,因为0是合法的边的编号。
说一下我的理解,h[a]应该是指以a为起点的最新一条边,也就是说确定了a,我们就能根据h[a]找到最后一条以a为起点的边索引;而ne[idx]意味着我们我们可以根据当前的边索引idx找到在他之前插入的边idx-1(如果存在的话);最好理解的就是e[idx],他表示索引为idx的边的终点是b。从而得到了一个模型:起点指向边,边指向终点和下一条边(一定意义上的上一条,因为我们用的是头插法)。