#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
const int mxN = 2e5 + 100;
const int mxB = 21;
vector<int> adj[mxN], c[mxN];
int st[mxN], sum[mxN], depth[mxN], dp[mxN][mxB], parent[mxN], seen[mxN], id[mxN], sz[mxN], dsu_par[mxN], total = 0, tin = 0;
void dfs(int u, int par){
parent[u] = dp[u][0] = par, st[u] = ++tin, depth[u] = depth[par] + 1;
for(int i = 1; i < mxB; ++i) dp[u][i] = dp[dp[u][i - 1]][i - 1];
for(auto it : adj[u]){
if(it ^ par) dfs(it, u);
}
}
int find(int u){
return (u == dsu_par[u] ? u : dsu_par[u] = find(dsu_par[u]));
}
void unite(int u, int v){
u = find(u), v = find(v);
if(u == v) return;
sz[v] += sz[u];
dsu_par[u] = v;
}
int process(int root){
if(seen[root] || root <= 0) return -1;
seen[root] = 1;
int ans = 0;
sort(all(c[root]), [&](int x, int y){
return st[x] < st[y];
});
c[root].push_back(c[root][0]);
for(int i = 0; i < (int) c[root].size() - 1; ++i){
int u = c[root][i], v = c[root][i + 1];
while(1){
if(!seen[id[u]]) ans += process(id[u]) + 1;
if(!seen[id[v]]) ans += process(id[v]) + 1;
if(u == v) break;
if(depth[u] > depth[v]) u = parent[u];
else v = parent[v];
if(u == -1 || v == -1) break;
}
}
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
int n, k, ans = 1e9;
cin >> n >> k;
for(int i = 0, u, v; i < n - 1; ++i){
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i = 1, x; i <= n; ++i) {
cin >> x;
c[x].push_back(i);
id[i] = x;
}
for(int i = 1; i <= k; ++i) dsu_par[i] = i, sz[i] = 1;
dfs(1, -1);
for(int i = 1; i <= k; ++i){
ans = min(ans, process(i));
for(int j = 1; j <= k; ++j) seen[j] = 0;
}
cout << ans << "\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... |