思路很简单,子树不同分支 没学lca,但是这题有明确主干,就是直接找公共祖先在主干上的点而且不是1 没有必要连上再减去一部分,直接全局算距离 树一般默认无向,无语,因为这个一直错 !!!没必要思考怎么连这个树,加边减边很难做,直接全局变量考虑
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
vector<int>g[N];
int par[N],dep[N];
bool ok[N];
int f[N];
void dfs1(int u,int p,int d)
{
par[u]=p;
dep[u]=d;
for(int v:g[u])
{
if(v!=p)
{
dfs1(v,u,d+1);
}
}
}
void dfs2(int u,int p)
{
if(u!=1)
{
f[u]=ok[u]?u:f[p];
}
for(int v:g[u])
{
if(v!=p)
{
dfs2(v,u);
}
}
}
void solve()
{
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
{
g[i].clear();
par[i]=0;dep[i]=0;
ok[i]=false;f[i]=0;
}
int t=n-1;
while(t--)
{
int a,b;cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs1(1,0,0);
for(int i=n;i!=0;i=par[i])
{
ok[i]=true;
}
f[1]=1;
dfs2(1,0);
int ans=dep[n];
while(m--)
{
int x;cin>>x;
if(!ok[x]&&f[x]!=1)
{
ans=max(ans,dep[x]+dep[n]-dep[f[x]]*2+1);
}
}
cout<<ans<<'\n';
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;cin>>t;
while(t--)
{
solve();
}
return 0;
}







