#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<vector<int>> adj(n + 1);
for (int i = 0, u, v; i < n - 1; ++i) {
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> par(n + 1);
auto dfs = [&](auto &&self, int u, int p) -> void {
for (int &i : adj[u]) {
if (i != p) {
par[i] = u;
self(self, i, u);
}
}
};
vector<int> c(n + 1);
vector<vector<int>> towns(k + 1);
for (int i = 1; i <= n; ++i) {
cin >> c[i];
towns[c[i]].push_back(i);
}
int ans = inf;
for (int i = 1; i <= n; ++i) {
par[i] = i;
dfs(dfs, i, 0);
vector<bool> vis(n + 1);
set<int> cur;
queue<int> q;
cur.insert(c[i]);
for (int &i : towns[c[i]]) {
q.push(i);
}
while (!q.empty()) {
int u = q.front();
q.pop();
if (vis[u]) {
continue;
}
vis[u] = true;
if (!cur.contains(c[u])) {
cur.insert(c[u]);
for (int &i : towns[c[u]]) {
q.push(i);
}
}
if (!vis[par[u]]) {
q.push(par[u]);
}
}
ans = min(ans, int(cur.size()) - 1);
}
cout << ans << '\n';
}
| # | 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... |