#include<bits/stdc++.h>
using namespace std;
vector<int>adj[500005];
int mn[500005];
int p[500005];
int sz[500005];
int cant[500005];
map<int,int>mp[500005];
int fp(int u){
    return p[u]==u?u:p[u]=fp(p[u]);
}
void un(int a,int b){
    if(sz[fp(a)]!=0&&sz[fp(b)]!=0)mp[fp(a)].clear(),mp[fp(a)][a]=1;
    else if(sz[fp(a)]==0)mp[fp(a)][b]=0,mp[fp(a)][a]=1;
    sz[fp(a)]+=sz[fp(b)];
    p[fp(b)]=fp(a);
}
int inf=1e9;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,k;cin>>n>>k;
    for(int i=0;i<n-1;i++){
        int a,b;cin>>a>>b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for(int i=1;i<=n;i++)mn[i]=inf,p[i]=i,mp[i][i]=1;
    queue<pair<int,pair<int,int>>>q;
    for(int i=0;i<k;i++){
        int x;cin>>x;
        sz[x]++;
        q.push({x,{x,0}});
    }
    while(!q.empty()){
        int u=q.front().first;
        int dis=q.front().second.second;
        int prv=q.front().second.first;
        q.pop();
        if(dis>mn[u])continue;
        if(dis<=mn[u]){
            if(mp[fp(u)][u]&&mp[fp(prv)][prv])un(u,prv);
            if(dis<mn[u]){
                for(auto x:adj[u])if(dis<mn[x])q.push({x,{u,dis+1}});
            }
        }
        mn[u]=min(mn[u],dis);
    }
    vector<int>ans;
    int cnt=0;
    for(int i=1;i<=n;i++)if(fp(i)==i)ans.push_back(i),cnt++;
    cout<<cnt<<"\n";
    for(auto x:ans)cout<<x<<" ";
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |