这道题就是一道求树的直径模板题。
树的最长路径模板 题型:图论 - 掘金 (juejin.cn)
我们这里用一遍dfs来做。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e4 + 10;
int h[N], e[N], ne[N], idx;
int n, m,ans;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int dfs(int u)
{
int d1 = 0, d2 = 0; //d1表示最大值,d2表示次大值
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
int d = dfs(j);
if (d >= d1)d2 = d1, d1 = d;
else if (d > d2)d2 = d;
}
ans = max(ans,d1+d2);
return d1 + 1;
}
int main()
{
cin >> n >> m;
memset(h,-1,sizeof h);
//读入交换机的父节点的编号
for (int i = 2; i <= n; i++)
{
int p; cin >> p;
add(p,i); //和父节点之间建边
}
//读入电脑的父节点交换机编号
for (int i = n + 1; i <= n+m; i++)
{
int p; cin >> p;
add(p,i);
}
dfs(1);
cout << ans << endl;
}