DP
Idea: dfs Function: Return the maximum length to the leaf node with this point as the root, plus 1 plus an edge above the vertex, by the recursive formula: dfs(i)=max{dfs(j)}+1 dfs( Leaf node)=1
#include<iostream>
using namespace std;
#include<cstring>
int idx;
int e[20005];
int h[20005];
int ne[20005];
int ans;
int n,m;
void add(int u,int v)
{
e[idx]=v;
ne[idx]=h[u];
h[u]=idx++;
}
int dfs(int u)
{
int d1=0,d2=0;
for(int i=h[u];~i;i=ne[i])
{
int t=dfs(e[i]);
if(t>=d1) //注意是>=不是=
{
d2=d1;
d1=t; // 注意d1,d2的赋值位置
}else if(t>d2)
{
d2=t;
}
}
ans=max(ans,d1+d2);
return d1+1;
}
int main()
{
memset(h,-1,sizeof(h));
cin>>n>>m;
int ed;
int pc;
for(int i=2;i<=n;i++)
{
scanf("%d",&ed);
add(ed,i);
}
for(int i=0,k=n+1;i<m;i++,k++)
{
scanf("%d",&pc);
add(pc,k);
}
dfs(1);
cout<<ans;
return 0;
}
BFS
#include<iostream>
#include<cstring>
using namespace std;
#include<vector>
#include<queue>
#define PII pair<int,int>
int dis[20005];
int vis[20005];
vector<int> gg[20005];
queue<PII > qq;
queue<int> ff;
int n,m;
void bfs_2(int a)
{
memset(vis,0,sizeof(vis));
qq.push({
a,0});
vis[a]=1;
PII tt;
int next;
int now;
while(!qq.empty())
{
tt=qq.front();
qq.pop();
now=tt.first;
for(int i=0;i<gg[now].size();i++)
{
next=gg[now][i];
if(!vis[next])
{
vis[next]=1;
qq.push({
next,tt.second+1});
}
}
if(qq.empty())
{
cout<<tt.second;
}
}
}
void bfs_1()
{
memset(vis,0,sizeof(vis));
ff.push(1);
vis[1]=1;
int next;
while(!ff.empty())
{
int now=ff.front();
ff.pop();
for(int i=0;i<gg[now].size();i++)
{
next=gg[now][i];
if(!vis[next])
{
vis[next]=1;
ff.push(next);
}
}
if(ff.empty())
{
bfs_2(now);
}
}
}
int main()
{
cin>>n>>m;
int c,d;
for(int i=2;i<=n;i++)
{
scanf("%d",&c);
gg[i].push_back(c);
gg[c].push_back(i);
}
for(int i=0,k=n+1;i<m;i++,k++)
{
scanf("%d",&d);
gg[k].push_back(d);
gg[d].push_back(k);
}
bfs_1();
return 0;
}
DFS
#include<iostream>
#include<cstring>
using namespace std;
#include<vector>
#include<queue>
#define PII pair<int,int>
int dis[20005];
int vis[20005];
vector<int> gg[20005];
queue<PII > qq;
queue<int> ff;
int n,m;
int max_p;
int max_l;
void dfs(int p,int level)
{
vis[p]=1;
if(level>max_l)
{
max_l=level;
max_p=p;
}
int next;
for(int i=0;i<gg[p].size();i++)
{
next=gg[p][i];
if(!vis[next])
{
dfs(next,level+1);
vis[next]=0; //这里面是树 可以不用再使vis变为0,最短路需要
}
}
}
int main()
{
cin>>n>>m;
int c,d;
for(int i=2;i<=n;i++)
{
scanf("%d",&c);
gg[i].push_back(c);
gg[c].push_back(i);
}
for(int i=0,k=n+1;i<m;i++,k++)
{
scanf("%d",&d);
gg[k].push_back(d);
gg[d].push_back(k);
}
dfs(1,0);
memset(vis,0,sizeof(vis));
dfs(max_p,0);
cout<<max_l;
return 0;
}