思路很简单,子树不同分支 没学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;
}








Auto comment: topic has been updated by cmkpjjnh (previous revision, new revision, compare).
Don't speak Chinese in Codeforces. It's an unwritten rule.
You can save your solution elsewhere (such as the Luogu Clipboard) instead of posting it in Chinese in Codeforces.