제출 #1159022

#제출 시각아이디문제언어결과실행 시간메모리
1159022fryingduc수도 (JOI20_capital_city)C++20
0 / 100
302 ms38800 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 2e5 + 5;
int n, k;
vector<int> g[maxn];
vector<int> vc[maxn];
int c[maxn];
int color_sz[maxn];
vector<int> active;
int par[maxn], sz[maxn];
bool vis[maxn], del[maxn];
int res;

void re_dfs(int u, int prev) {
  active.push_back(u);
  sz[u] = 1;
  for (auto v:g[u]) {
    if (v == prev || del[v]) continue;
    re_dfs(v, u);
    sz[u] += sz[v];
  }
}

int find_centroid(int u, int prev, int n) {
  for (auto v:g[u]) {
    if (v == prev || del[v]) continue;
    if (sz[v] * 2 > n) {
      return find_centroid(v, u, n);
    }
  }
  return u;
}

int lab[maxn];

int find(int u) {
  return lab[u] < 0 ? u : lab[u] = find(lab[u]);
}

void join(int u, int v) {
  u = find(u), v = find(v);
  if (u == v) return;
  lab[u] += lab[v];
  lab[v] = u;
}

void dfs_cen(int u, int prev) {
  for (auto v:g[u]) {
    if (v == prev || del[v]) continue;
    par[v] = u;
    dfs_cen(v, u);
  }
}

void decompose(int u, int prev) {
  active.clear();
  re_dfs(u, prev);
  int cen = find_centroid(u, prev, sz[u]);
  for (auto x:active) {
    lab[x] = -1;
    vis[c[x]] = 0;
    vc[c[x]].push_back(x);
  }
  par[cen] = 0;
  dfs_cen(cen, 0);
  queue<int> q;
  vis[c[cen]] = 1;
  q.push(c[cen]);
  bool flag = 1;
  int tot = 0;
  while (!q.empty()) {
    int cur_color = q.front();
    q.pop();
    ++tot;
    if (color_sz[cur_color] != (int)vc[cur_color].size()) {
      flag = 0;
      break;
    }
    for (auto vertex:vc[cur_color]) {
      vertex = find(vertex);
      if (par[vertex]) {
        if (!vis[c[par[vertex]]]) {
          q.push(c[par[vertex]]);
          vis[c[par[vertex]]] = 1;
        }
        join(vertex, par[vertex]);
      }
    }
  }
  if (flag) {
    res = min(res, tot - 1);
  }
  del[cen] = 1;
  for (auto x:active) {
    vc[c[x]].clear();
  }
  for (auto v:g[cen]) {
    if (del[v] || v == prev) continue;
    decompose(v, cen);
  }
}

void solve() {
  cin >> n >> k;
  for (int i = 1; i < n; ++i) {
    int u, v; cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = 1; i <= n; ++i) {
    cin >> c[i];
    ++color_sz[c[i]];
  }
  res = n;
  decompose(1, 0);
  cout << res;  
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...