對於樹上任意一點來講,相距最遠的點要麼是從父節點走過來的,要麼就是從兒子節點中走過來。因此可以先進行一次自下向上的dp,處理出從兒子節點過來的最遠點的距離。然後再進行一次自上而下的dp,同時傳入從父親節點過來時最遠點的距離,這樣和從兒子節點過來的最遠點的距離對比一下,就可以找到距這個點最遠的點的距離了。
INF = 0x3f3f3f3fN = 0g = [[]]dp = []ans = []res = 0def input(): global N, g N = int(raw_input()) g = [[] for i in range(N + 1)] for i in range(2, N + 1): x = int(raw_input()) g[x].append(i), g[i].append(x)def bottom_up(x, px): global dp, g dp[x] = 0 for y in g[x]: if y == px: continue bottom_up(y, x) dp[x] = max(dp[x], dp[y] + 1)def top_down(x, px, dis): global dp, res, ans, g t = max(dp[x], dis) if t < res: res = t ans = [x] elif t == res: ans.append(x) opt = [dp[i] + 1 for i in g[x]] for i in range(len(opt) - 2, -1, -1): opt[i] = max(opt[i], opt[i + 1]) i = 0 t = dis for y in g[x]: i += 1 if y == px: continue ndis = t if i < len(opt) and opt[i] > ndis: ndis = opt[i] top_down(y, x, ndis + 1) t = max(t, dp[y] + 1) def process(): global N, dp, res, ans dp = [-1 for i in range(N + 1)] bottom_up(1, -1) res = 0x3f3f3f3f top_down(1, -1, 0) ans.sort() for i in ans: print i, print#maininput()process()