给定一个公司的网络,由 n n n 台交换机和 m m m 台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。
交换机按层级设置,编号为 1 1 1 的交换机为根交换机,层级为 1 1 1。
其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加 1 1 1。
所有的终端电脑都直接连接到交换机上。
当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。
请问,电脑与电脑之间传递消息、或者电脑与交换机之间传递消息、或者交换机与交换机之间传递消息最多需要多少步。
输入格式
输入的第一行包含两个整数
n
,
m
n,m
n,m,分别表示交换机的台数和终端电脑的台数。
第二行包含 n − 1 n−1 n−1 个整数,分别表示第 2 、 3 、 … … 、 n 2、3、……、n 2、3、……、n 台交换机所连接的比自己上一层的交换机的编号。第 i i i 台交换机所连接的上一层的交换机编号一定比自己的编号小。
第三行包含 m m m 个整数,分别表示第 1 、 2 、 … … 、 m 1、2、……、m 1、2、……、m 台终端电脑所连接的交换机的编号。
输出格式
输出一个整数,表示消息传递最多需要的步数。
数据范围
1
≤
n
≤
10000
,
1
≤
m
≤
10000
。
1≤n≤10000,1≤m≤10000。
1≤n≤10000,1≤m≤10000。
输入样例1:
4 2
1 1 3
2 1
输出样例1:
4
样例1解释
样例的网络连接模式如下,其中圆圈表示交换机,方框表示电脑:
其中电脑
1
1
1 与交换机
4
4
4 之间的消息传递花费的时间最长,为
4
4
4 个单位时间。
输入样例2:
4 4
1 2 2
3 4 4 4
输出样例2:
4
样例2解释
样例的网络连接模式如下:
其中电脑
1
1
1 与电脑
4
4
4 之间的消息传递花费的时间最长,为
4
4
4 个单位时间。
- 树的直径
- 代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int n,m;
vector<int>e[maxn<<1];
int dp[maxn<<1];
int ans;
void dfs(int u,int fa) {
for (auto &v:e[u]) {
if (v == fa) continue;
dfs(v, u);
ans = max(ans, dp[u] + dp[v] + 1);
dp[u] = max(dp[u], dp[v] + 1);
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 2, fa; i <= n; i++) {
scanf("%d", &fa);
e[i].push_back(fa);
e[fa].push_back(i);
}
for (int i = 1, x; i <= m; i++) {
scanf("%d", &x);
e[i + n].push_back(x);
e[x].push_back(i + n);
}
dfs(1, 1);
printf("%d\n", ans);
return 0;
}