#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxn = 20000 + 5;
struct Edge{
int from, to, dist;
Edge(int u, int v, int d=1): from(u),to(v),dist(d) {}
};
vector<Edge> edges;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int index = -1;
void solve(int start){
queue<int> Q;
Q.push(start);
vis[start] = true;
while(!Q.empty()){
int u = Q.front(); Q.pop();
index = u;
for(int i=0; i<G[u].size(); ++i){
Edge& e = edges[G[u][i]];
if(!vis[e.to]){
Q.push(e.to);
vis[e.to] = true;
d[e.to] = d[u] + 1;
}
}
}
}
int main(){
scanf("%d%d", &n,&m);
int u;
for(int i=1; i<n; ++i){
scanf("%d", &u); u--;
edges.push_back(Edge(u,i));
G[u].push_back(edges.size()-1);
edges.push_back(Edge(i,u));
G[i].push_back(edges.size()-1);
}
for(int i=0; i<m; ++i){
scanf("%d", &u); u--;
edges.push_back(Edge(u,n+i));
G[u].push_back(edges.size()-1);
edges.push_back(Edge(n+i,u));
G[n+i].push_back(edges.size()-1);
}
memset(vis,false,sizeof(vis));
memset(d,0,sizeof(d));
solve(0);
memset(vis,false,sizeof(vis));
memset(d,0,sizeof(d));
solve(index);
printf("%d\n", d[index]);
return 0;
}
ccf网络延时
最新推荐文章于 2023-03-12 19:31:05 发布