求树中距离最远的两个点的距离,也就是求树的直径
求法:先随便找一个点,找到离它最远的一个点s,再以s为起始点,继续找离s最远的点,这个距离就是树的直径
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=20000+10; //交换机数量+电脑数量
int dist[N],n,m;
vector<int> g[N]; //邻接表
int main()
{
scanf("%d%d",&n,&m);
int num=n+m,a;
for(int i=2;i<=n;i++)
{
scanf("%d",&a);
g[a].push_back(i);
g[i].push_back(a);
}
for(int i=1;i<=m;i++)
{
scanf("%d",&a);
g[a].push_back(i+n);
g[i+n].push_back(a);
}
int ma;
memset(dist,-1,sizeof(dist));
queue<int> q;
q.push(1);
dist[0]=0;
while(!q.empty()) //第一次搜索
{
int u=q.front();
ma=u; //最后出来的就是最远的节点
q.pop();
int l=g[u]