#include #include #include #include #include #include using namespace std; const int MAX_N = 10100; const int MAX_K = 310; vector A[MAX_N]; int adj[MAX_K][MAX_K]; int d[MAX_K]; int s[MAX_K]; int n, k; int dist[MAX_N]; void bfs(int st, int adj[MAX_K]) { memset(dist, 0, sizeof(dist)); queue Q; Q.push(st); dist[st] = 1; while(!Q.empty()) { int nod = Q.front(); Q.pop(); for(auto it : A[nod]) { if(!dist[it]) { dist[it] = dist[nod] + 1; Q.push(it); } } } for(int i = 1; i <= k; i++) { adj[i] = dist[d[i]] - 1; } } vector B[MAX_K]; void make(int cost) { for(int i = 1; i <= k; i++) { B[i].clear(); } for(int i = 1; i <= k; i++) { for(int j = 1; j <= k; j++) { if(adj[i][j] <= cost) { B[i].push_back(j); } } } } int viz[MAX_K]; int l[MAX_K]; int r[MAX_K]; int pairup(int nod) { if(viz[nod]) { return 0; } viz[nod]=1; for(auto it : B[nod]) { if(!r[it]) { l[nod]=it; r[it]=nod; return 1; } } for(auto it : B[nod]) { if(pairup(r[it])) { l[nod]=it; r[it]=nod; return 1; } } return 0; } bool cuplaj(int cost) { make(cost); memset(l, 0, sizeof(l)); memset(r, 0, sizeof(r)); bool change=true; while(change) { change=false; memset(viz,0,sizeof(viz)); for(int i=1;i<=k;i++) { if(!l[i]) { if(pairup(i)) { change=true; } } } } int sz=0; for(int i=1;i<=k;i++) { if(l[i]) { sz++; } } return sz == k; } int search(int st, int dr) { int ans = 0; while(st <= dr) { int mij = (st + dr) / 2; if(cuplaj(mij)) { ans = mij; dr = mij - 1; } else { st = mij + 1; } } return ans; } int main() { //ifstream cin("fis.in"); //ofstream cout("fis.out"); cin >> n >> k; for(int i = 1; i <= k; i++) { cin >> s[i]; } for(int i = 1; i <= k; i++) { cin >> d[i]; } for(int i = 1; i < n; i++) { int a, b; cin >> a >> b; A[a].push_back(b); A[b].push_back(a); } for(int i = 1; i <= k; i++) { bfs(s[i], adj[i]); } cout << search(0, n); return 0; }