Submission #1300267

#TimeUsernameProblemLanguageResultExecution timeMemory
1300267avighnaCapital City (JOI20_capital_city)C++20
11 / 100
3095 ms28424 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...