#include<iostream>
#include<string.h>
#include<stdio.h>
#include<vector>
using namespace std;
const int maxx=140000;
vector<int> lin[maxx];
int deep[maxx],fa[maxx],top[maxx],in[maxx],bs[maxx];
int dfs1(int x,int pre,int d)
{
deep[x]=d;
fa[x]=pre;
in[x]=++num;
for (int i=0;i<lin[x].size();i++)
{
int nex=lin[x][i];
if (fa[x]==nex) continue;
dfs1(nex,x,d+1);
}
bs[x]=num-in[x]-1;
return;
}
int dfs2(int x,int t)
{
top[x]=t;
in[x]=++num;
int msize=0,hea=0;
if (lin[x].size()==1) return;
for (int i=0;i<lin[x].size();i++)
{
int nex;
nex=lin[x][i];
if (fa[x]==nex) continue;
if (bs[nex]>msize)
{
msize=be[nex];
hea=nex;
}
}
dfs2(hea,t);
for (int i=0;i<lin[x].size();i++
{
int nex=lin[x][i];
if (fa[x]==nex || hea==nex) continue;
dfs(nex,nex);
}
}
#include<string.h>
#include<stdio.h>
#include<vector>
using namespace std;
const int maxx=140000;
vector<int> lin[maxx];
int deep[maxx],fa[maxx],top[maxx],in[maxx],bs[maxx];
int dfs1(int x,int pre,int d)
{
deep[x]=d;
fa[x]=pre;
in[x]=++num;
for (int i=0;i<lin[x].size();i++)
{
int nex=lin[x][i];
if (fa[x]==nex) continue;
dfs1(nex,x,d+1);
}
bs[x]=num-in[x]-1;
return;
}
int dfs2(int x,int t)
{
top[x]=t;
in[x]=++num;
int msize=0,hea=0;
if (lin[x].size()==1) return;
for (int i=0;i<lin[x].size();i++)
{
int nex;
nex=lin[x][i];
if (fa[x]==nex) continue;
if (bs[nex]>msize)
{
msize=be[nex];
hea=nex;
}
}
dfs2(hea,t);
for (int i=0;i<lin[x].size();i++
{
int nex=lin[x][i];
if (fa[x]==nex || hea==nex) continue;
dfs(nex,nex);
}
}