和 2022 2022 2022 天梯的 龙龙送外卖 简直是一模一样的题
对每个需要跑的点(把 y y y 也加入)向父节点进行染色,最终答案即为 2 ∗ ( 染 色 点 − 1 ) 2*(染色点-1) 2∗(染色点−1) − d i s [ y ] -\ dis[y] − dis[y] ,因为最终需要走到 y y y 的位置上
什么嘛,原来天梯里 L2 就放 cf1800 了吗
#include <bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int N=2e5+10;
int n, k, x, y;
vector<int> h[N];
bool a[N],vis[N];
int dis[N];
bool dfs(int u,int fa){
dis[u]=dis[fa]+(u!=fa);
vis[u]=a[u];
for(auto i:h[u])
if(i!=fa){
vis[u]|=dfs(i, u);
}
return vis[u];
}
void solve(){
cin>>n>>k>>x>>y;
for(int i=1;i<=n;i++)
h[i].clear();
for(int i=0;i<=n;i++){
a[i]=0;
dis[i]=0;
vis[i]=0;
}
for(int i=1;i<=k;i++){
int temp;
cin>>temp;
a[temp]=1;
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
h[u].push_back(v);
h[v].push_back(u);
}
a[x]=a[y]=1;
dfs(x,x);//预处理每个点到x的距离
// for(int i=1;i<=n;i++)
// cout<<dis[i]<<" ";
// cout<<endl;
int cnt=0;
for(int i=1;i<=n;i++)
cnt+=vis[i];
cout<<(cnt-1)*2-dis[y]<<endl;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
solve();
return 0;
}