树形dp,比较巧妙的地方就是其中每个询问均为x,y,分别代表以x为根的情况下,y的最小儿子和最小后代.
如果如何通过一次树形dp,求出每次不同根的情况呢.这里用到了一个非常巧妙的方法.在数据结构里面,通过树的先序,中序,后序遍历结果中的任意两种,就可以确定下这棵树的形态.在这里也是通过一个时间戳,记录下每个点到达和离开的时间就可以确定树的形态了.如果a结点是b结点的孩子,那么a的进入时间必须比b小,且离开时间比b大.
void dfs(int rt)
{
id[rt][0]=time;
for(i=0;i<size;i++)
{
son=tree[rt][i];
time++;
dfs(son);
}
id[rt][1]=ti;
time++;
}