树的最长直径
#include <iostream> #include <cstring> using namespace std; const int N = 1e5+10; int d[N], ans; int h[N], tot, vis[N]; struct Edge{ int to,nxt,w; }e[N << 1]; void add(int a,int b,int c) { e[tot].to = b, e[tot].w = c, e[tot].nxt = h[a], h[a] = tot ++; } void dfs(int u,int fa) { vis[u] = 1; for(int i = h[u]; ~i; i = e[i].nxt) { int to = e[i].to; if(to == fa) continue; dfs(to, u); ans = max(ans, d[u] + d[to] + e[i].w); d[u] = max(d[u], d[to] + e[i].w); } } int main() { memset(h, -1, sizeof h); int n, m; cin >> n >> m; for(int i = 2; i <= n; ++i) { int x; cin >> x; add(i, x, 1); add(x, i, 1); } for(int i = 1; i <= m; ++i) { int x; cin >> x; add(x, i + n, 1); add(i + n, x, 1); } dfs(1, -1); cout << ans; }