原题直通车:HDU 4008 Parent and son
分析:
如果a、b之间存在一条边,那么把a当树根和把b当树根只在a, b这两结点的信息有所区别,其它的不变。
所以,先以任意一个点做为根的所求出每个点的最小孩子min_son、最小子孙min_des
然后,就可分别把树根转移到其它结点时,每个点的最小孩子、最小子孙求出。
代码:
#include#include #include #include #include using namespace std; const int maxn=100005; vector G[maxn]; vector< pair >Q[maxn]; int min_son[maxn], min_des[maxn]; int ans1[maxn], ans2[maxn]; bool vis[maxn]; void dfs(int cnt) { min_son[cnt]=maxn, min_des[cnt]=maxn; vis[cnt]=true; int len=G[cnt].size(); for(int i=0; i