int fa[20005],anc[20005];
bool flag[20005];
vector<int> map[20005];
vector<int> query[20005];
inline void inputTree()
{
int a,b;
for(int i=1;i<=N;i++)
map[i].clear();
for(int i=1;i<N;i++)
{
scanf("%d%d",&a,&b);
map[a].push_back(b);
map[b].push_back(a);
}
}
inline void inputQuery()
{
int a,b;
for(int i=1;i<=N;i++)
query[i].clear();
for(int i=1;i<=M-N+1;i++)
{
scanf("%d%d",&a,&b);
query[a].push_back(b);
query[b].push_back(a);
}
}
inline void init()
{
ans=INF;
for(int i=1;i<=N;i++)
fa[i]=i;
memset(flag,0,sizeof(flag));
}
inline int find(int x)
{
if(x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
inline void HB(int x,int y)
{
int a,b;
a=find(x);b=find(y);
fa[a]=b;
}
inline void Tarjan(int x,int last)
{
int next;
for(int i=0;i<map[x].size();i++)
{
next=map[x][i];
if(next!=last)
{
Tarjan(next,x);
HB(x,next);
anc[find(x)]=x;
}
}
flag[x]=1;
for(int i=0;i<query[x].size();i++)
{
int temp=query[x][i];
if(flag[temp])
{
int LCA=anc[find(temp)];
}
}
}
int main()
{
int i,a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
init();
inputTree();
inputQuery();
Tarjan(1,-1);
}
return 0;
}
相比在线还是快点的。。