第四次CCF软件能力认证D题-网络延时 题型:树的最长直径模板题

62 阅读1分钟

3215. 网络延时 - AcWing题库

这道题就是一道求树的直径模板题。

树的最长路径模板 题型:图论 - 掘金 (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;
}