这两天在吃力地学DP的优化,被虐地不行不行的。搞个小插曲。
左儿子右兄弟,顾名思义,是一棵转换后的树,它是一棵二叉树,一个节点的左子树表示的是原树中这个节点的子节点,一个节点的右子树表示的是这个节点在原树中的兄弟(父节点相同的点)。
这么表示有什么好处呢?在DP时二叉树的优势相比于普通树是很明显的,或许有时它不能优化时间,但至少可以优化“思路”。
最近并没有碰到要转二叉树的题,也没什么题解可写,等碰到了再补充吧,现在先把模板贴在这里喽。直接递归建树即可,原树是用vector保存的。
void dfs(int u){
if(!u || !G[u].size()) return;
lc[u] = G[u][0];
dfs(lc[u]);
int v = lc[u];
for(int i = 1; i < G[u].size(); i++){
rc[v] = G[u][i];
dfs(rc[v]);
v = rc[v];
}
}