#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e5+5;
int n,k,a[N],sum[N],sz[N],check[N],del[N],par[N],vis[N],ans = 1e9;
vector<int>adj[N],loj,col[N];
int dfs(int u, int p){
sz[u] = 1;
for(int v: adj[u]){
if(v != p && !del[v]){
dfs(v,u);
sz[u] += sz[v];
}
}
return sz[u];
}
int find_centroid(int u, int p, int tot){
for(int v: adj[u]){
if(v != p && !del[v] && sz[v] > tot/2) return find_centroid(v,u,tot);
}
return u;
}
void get(int u, int p, int mau){
loj.push_back(u);
par[u] = p;
for(int v: adj[u]){
if(v != p && !del[v]) get(v,u,mau);
}
}
void decompose(int u){
int cent = find_centroid(u,0,dfs(u,0));
loj.push_back(cent);
del[cent] = 1;
for(int v: adj[cent]){
if(!del[v]) get(v,cent,a[cent]);
}
int res = 0;
for(int v: loj) col[a[v]].push_back(v);
queue<int>q;
q.push(a[cent]);
while(!q.empty()){
int u = q.front();
q.pop();
if(check[u]) continue;
if(col[u].size() < sum[u]){
res = 1e9;
break;
}
check[u] = 1;
res++;
for(int v: col[u]){
int du = v;
while(du != 0 && !vis[du]){
vis[du] = 1;
q.push(a[du]);
du = par[du];
}
}
}
ans = min(ans,res-1);
for(int v: loj){
check[a[v]] = 0;
vis[v] = 0;
col[a[v]].clear();
}
loj.clear();
for(int v: adj[cent]){
if(!del[v]) decompose(v);
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> k;
for(int i = 1; i < n; i++){
int u,v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i = 1; i <= n; i++){
cin >> a[i];
sum[a[i]]++;
}
decompose(1);
cout << ans;
}
| # | 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... |