/* There's no such thing as a limit on being the best. You can always go for more. That's what it means to be human. No... That's what it means to be me. */ #include #include #include #include #include #define FIT(a,b) for(vector::iterator a=b.begin();a!=b.end();a++) #define FITP(a,b) for(vector >::iterator a=b.begin();a!=b.end();a++) #define RIT(a,b) for(vector::reverse_iterator a=b.end();a!=b.begin();++a) #include #define ROF(a,b,c) for(int a=b;a>=c;--a) #include #include #define FOR(a,b,c) for(int a=b;a<=c;++a) #define REP(a,b) for(register int a=0;a #include #include #include #include #define f cin #define g cout #include #define debug cerr<<"OK"; #define pii pair #define mp make_pair #define pb push_back #define fi first #define se second #define ll long long #define ull unsigned long long #define mod 1000000007 #define N 100100 #define K 310 #define SQR 350 #define inf 1<<30 #define div pula #define hi pizda #define down haha using namespace std; /*int dx[]={0,0,0,1,-1}; int dy[]={0,1,-1,0,0};*/ queue q; vector h[N], v[N]; int spe[N],D[K][K],n,mij,tok[N],k,OK,L[K],R[K],sol,tak[N],viz[N],x,serv[N],y,ser[N],sp[N]; void bfs(int x) { int ind=x; x=serv[x]; memset(viz,0,sizeof(viz)); viz[x]=1; while(!q.empty()) q.pop(); q.push(x); while(!q.empty()) { x=q.front(); q.pop(); FIT(it,v[x]) if(!viz[*it]) { viz[*it]=viz[x]+1; if(sp[*it]) { FIT(it2,h[*it]) D[ind][*it2]=viz[*it]-1; } q.push(*it); } } } int cuplaj(int x) { if(viz[x]) return 0; viz[x]=1; FOR(i,1,k) if(D[x][i]<=mij&&!R[i]) { L[x]=i; R[i]=x; return 1; } FOR(i,1,k) if(D[x][i]<=mij&&cuplaj(R[i])) { L[x]=i; R[i]=x; return 1; } return 0; } int main () { #ifndef ONLINE_JUDGE freopen("a.in","r",stdin); freopen("a.out","w",stdout); #endif f>>n>>k; FOR(i,1,k) { f>>x; sp[x]=1; h[x].pb(i); } FOR(i,1,k) { f>>x; serv[i]=x; ser[x]=1; } FOR(i,1,n-1) { f>>x>>y; v[x].pb(y); v[y].pb(x); } FOR(i,1,k) bfs(i); int st=0; int dr=n+1; while(st<=dr) { mij=(st+dr)>>1; OK=1; FOR(i,1,n) L[i]=R[i]=0; int cnt=0; while(OK) { memset(viz,0,sizeof(viz)); OK=0; FOR(i,1,k) if(!L[i]&&cuplaj(i)) { OK=1; ++cnt; } } if(cnt==k) { sol=mij; dr=mij-1; } else st=mij+1; } g<