int h[N]; // 顶点 i 的邻接表的首边索引 int e[M]; // 第 i 条边的终点 int ne[M]; // 第 i 条边的下一条边索引 int w[M]; // 第 i 条边的权重 int idx; // 当前边的索引
给出变量名详细解释:
1 2 3 4 5
int h[N]; // h 数组,存储每个顶点的第一条边的索引。h[i] 表示顶点 i 的第一条边在 e 数组中的索引。 int e[M]; // e 数组,存储每条边的终点。e[i] 表示第 i 条边的终点。 int ne[M]; // ne 数组,存储每条边的下一条边的索引。ne[i] 表示第 i 条边的下一条边在 e 数组中的索引。 int w[M]; // w 数组,存储每条边的权重。w[i] 表示第 i 条边的权重。 int idx; // idx 变量,记录当前边的数量,同时作为边的索引。
容易混淆的点:
e[M]:如果你有一条边从顶点 u 到顶点 v,那么 e 数组的对应位置(例如 e[idx])就是顶点 v
ne[M]:ne[i] 表示第 i 条边在邻接表中指向的下一条边的索引。这使得我们可以在遍历某个顶点的邻接边时,依次访问所有与该顶点相邻的边。
constint N = 510; // 顶点数量上限 constint M = 100010; // 边数量上限 constint INF = 0x3F3F3F3F; // 无穷大
int h[N]; // 每个顶点的邻接表首条边的索引 int ne[M]; // 每条边的下一条边的索引 int e[M]; // 每条边的终点 int w[M]; // 每条边的权重 int idx; // 当前边的索引
// 添加一条边 a -> b,边权为 c voidadd(int a, int b, int c){ e[idx] = b; // 设置边的终点为 b w[idx] = c; // 设置边的权重为 c ne[idx] = h[a]; // 当前边的下一条边索引 h[a] = idx++; // 更新顶点 a 的邻接表首条边为当前边 }