#include <algorithm>
#include <iostream>
#include <fstream>
#include <climits>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
// #include <bits/stdc++.h>
#define in cin
#define out cout
using namespace std;
vector<int> g[500001];
int niv[500001];
int dist[500001]; // dist minima pana la o oaie
int oi[500001];
int f[500001];
int n, m;
bool prt[500001]; // protejat (used protection :))
void fa_nivele(int nod){
for(const int &x : g[nod]){
if(x == f[nod]) continue;
niv[x] = niv[nod] + 1;
f[x] = nod;
fa_nivele(x);
}
}
bool cmp(const int &a, const int &b){
return niv[a] > niv[b]; // de la leaf in sus kinda
}
void marcheaza(int nod, int d){ // d e ca un 'range' in care protejeaza oile
prt[nod] = 1;
for(const int &x : g[nod]){
if(prt[x]) continue;
if(dist[x] != d - 1) continue; // scade dist spre o oaie
marcheaza(x, d - 1);
}
}
vector<int> pastori;
void chiar_solve(){
fa_nivele(1);
queue<int> q; // un fel de bfs de la toate oile
for(int i = 1; i <= n; i++) dist[i] = n + 10;
for(int i = 0; i < m; i++){
dist[ oi[i] ] = 0;
q.push( oi[i] );
}
while(!q.empty()){
int nod = q.front(); q.pop();
for(const int &x : g[nod]){
if( dist[x] > dist[nod] + 1 ){
dist[x] = dist[nod] + 1;
q.push(x);
}
}
}
// cout << "dist : "; // merge
// for(int i = 1; i <= n; i++) cout << dist[i] << " ";
// cout << '\n';
sort(oi + 0, oi + m, cmp); // oile cele mai de jos
/*
ce osa fac e asa:
zic ok, e aparata oaia i? - da : continue
daca nu zic ok, o apar la pozitia ei. Cat de sus pot sa urc a.i. sa fie cea mai apropiata oaie de mine?
cand ajung acolo like marchez toate restul oilor protejate si continui
*/
for(int i = 0; i < m; i++){
if(prt[ oi[i] ]) continue;
int ps = oi[i];
while(ps != 1 && dist[ps] + 1 == dist[ f[ps] ]){ // dist se incrementeaza cu cat urc
ps = f[ps];
}
// cout << "Il fac pastor pe " << ps << " de la oaia " << oi[i] << '\n';
pastori.push_back(ps);
marcheaza(ps, niv[oi[i]] - niv[ps]);
}
}
signed main(){
ios_base::sync_with_stdio(false);
in.tie(NULL);
in >> n >> m;
for(int i = 0; i < n - 1; i++){
int a, b; in >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
for(int i = 0; i < m; i++) in >> oi[i];
chiar_solve();
out << pastori.size() << '\n';
for(const int &x : pastori) out << x << " ";
out << '\n';
return 0;
}
# | 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... |