- 此时栈中还有 3 个节点: $1, 3,7$ ,很明显它们是一条链上的,所以直接链接: $1->3$ 和 $3->7$ 的边。
- 虚树就建完啦!
-其中有很多细节,比如我是用临接表存图的方式存虚树的,所以需要清空临接表。但是直接清空整个临接表是很慢的,所以我们在 **有一个从未入栈的元素入栈的时候清空该元素对应的临接表** 即可。
+其中有很多细节,比如我是用邻接表存图的方式存虚树的,所以需要清空邻接表。但是直接清空整个邻接表是很慢的,所以我们在 **有一个从未入栈的元素入栈的时候清空该元素对应的邻接表** 即可。
建立虚树的 C++ 代码大概长这样:
```cpp
sort(h + 1, h + 1 + k, cmp);
sta[top = 1] = 1, g.sz = 0, g.head[1] = -1;
-// 1号节点入栈,清空1号节点对应的临接表,设置临接表边数为1
+// 1号节点入栈,清空1号节点对应的邻接表,设置邻接表边数为1
for (int i = 1, l; i <= k; i += 1)
if (h[i] != 1) //如果1号节点是关键节点就不要重复添加
{
if (id[l] > id[sta[top - 1]])
//如果LCA不等于次大节点(这里的大于其实和不等于没有区别)
g.head[l] = -1, g.push(l, sta[top]), sta[top] = l;
- //说明LCA是第一次入栈,清空其临接表,连边后弹出栈顶元素,并将LCA入栈
+ //说明LCA是第一次入栈,清空其邻接表,连边后弹出栈顶元素,并将LCA入栈
else
g.push(l, sta[top--]);
//说明LCA就是次大节点,直接弹出栈顶元素
}
g.head[h[i]] = -1, sta[++top] = h[i];
- //当前节点必然是第一次入栈,清空临接表并入栈
+ //当前节点必然是第一次入栈,清空邻接表并入栈
}
for (int i = 1; i < top; i += 1)
g.push(sta[i], sta[i + 1]); //剩余的最后一条链连接一下