传送门:CCF201503-4 网络延时
考前刷一道第四题QAQ
题意是给你一棵树,求树的直径。如果每个节点依次进行一次dfs求最大深度,是会超时的(应该)。所以,我们先对任意一个节点u进行一次dfs,找到离u最远的节点v,再对v进行一次dfs,得到的最大深度就是答案了。
好了,博主要准备去考CCF了QAQ
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 2e4+10;
int n, m;
int vis[maxn], maxdis = 0, maxdis_v;
vector <int> g[maxn];
void read()
{
cin >> n >> m;
for(int i = 2; i <= n+m; ++i)
{
int fa;
cin >> fa;
g[fa].push_back(i);
g[i].push_back(fa);
}
}
void dfs(int u, int d)
{
vis[u] = 1;
for(int i = 0; i < g[u].size(); ++i)
{
int v = g[u][i];
if(d > maxdis)
{
maxdis = d;
maxdis_v = v;
}
if(!vis[v])
dfs(v, d+1);
}
}
void solve()
{
dfs(1, 1);
maxdis = 0;
memset(vis, 0, sizeof(vis));
dfs(maxdis_v, 1);
cout << maxdis;
}
int main()
{
read();
solve();
return 0;
}