⬅ 返回实验大厅 💻 查看 VS Code 高亮源码 ➔

4 个点、5 条边图例:链式前向星全景可视化

全面展示:拓扑图 ➔ 4 条独立的出边单链表(完整版) ➔ 内存终态数组
步骤 1 逻辑拓扑图(4 个顶点,5 条有向边)
1 2 3 4 边 0 (1->2) 边 1 (1->3) 边 3 (3->2) 边 2 (2->4) 边 4 (3->4)
核心灵魂 每个顶点的“出边单链表”与下方对应的代码执行跟踪(图文对照)
head[1]
1
edge[1] (最新加入)
first (to)
3
second (next)
0
edge[0] (最早加入)
first (to)
2
second (next)
-1
NULL (-1 结束)
1 号点能到达: 3, 2
执行 add(1, 2) , cnt = 0:
edge[0].first = 2; edge[0].second = head[1] = -1; // 当时 head[1] 是 -1,所以存 -1 head[1] = 0; // 更新 head[1] 为 0 cnt++; // cnt 变成 1
链条变成:head[1](0) -> edge[0](first=2) -> -1
执行 add(1, 3) , cnt = 1:
edge[1].first = 3; edge[1].second = head[1] = 0; // 当时 head[1] 是 0,所以存 0 head[1] = 1; // 更新 head[1] 为 1 cnt++; // cnt 变成 2
链条变成:head[1](1) -> edge[1](first=3) -> edge[0](first=2) -> -1
head[2]
2
edge[2]
first (to)
4
second (next)
-1
NULL (-1 结束)
2 号点能到达: 4
执行 add(2, 4) , cnt = 2:
edge[2].first = 4; edge[2].second = head[2] = -1; // 当时 head[2] 是 -1,所以存 -1 head[2] = 2; // 更新 head[2] 为 2 cnt++; // cnt 变成 3
链条变成:head[2](2) -> edge[2](first=4) -> -1
head[3]
4
edge[4] (最新加入)
first (to)
4
second (next)
3
edge[3] (最早加入)
first (to)
2
second (next)
-1
NULL (-1 结束)
3 号点能到达: 4, 2
执行 add(3, 2) , cnt = 3:
edge[3].first = 2; edge[3].second = head[3] = -1; // 当时 head[3] 是 -1,所以存 -1 head[3] = 3; // 更新 head[3] 为 3 cnt++; // cnt 变成 4
链条变成:head[3](3) -> edge[3](first=2) -> -1
执行 add(3, 4) , cnt = 4:
edge[4].first = 4; edge[4].second = head[3] = 3; // 当时 head[3] 是 3,所以存 3 head[3] = 4; // 更新 head[3] 为 4 cnt++; // cnt 变成 5
链条变成:head[3](4) -> edge[4](first=4) -> edge[3](first=2) -> -1
head[4]
-1
NULL (初始 -1,无任何出边)
4 号点能到达: (无)
状态说明:
// 4 号点没有连出任何边,head[4] 保持初始值 -1 // 遍历时判断 i = head[4] 即为 -1,不进入循环 (i = edge[i].second)
链条状态:head[4] -> -1 (无出边)
为什么 1 号点输出 3, 2 而不是 2, 3?
因为边是“头插法”加入的:先加了 1->2 (edge[0]),后加了 1->3 (edge[1])。
最新的边会变成链表头,所以遍历顺着 head[1] ➔ edge[1] ➔ edge[0] 走,自然先遇到 3,再遇到 2!
数据 底层物理数组储存的完整数据

head 数组(每个点的链表头)

点编号 uhead[u] 的值含义
11最新边在 edge[1]
22最新边在 edge[2]
34最新边在 edge[4]
4-1没有出边

edge 数组(PII 存储池: pair<first, second>)

下标 cnt.first (to 终点).second (next 同起点上一条边)
edge[0]2-1
edge[1]30
edge[2]4-1
edge[3]2-1
edge[4]43