This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 1e9+9;
const ll LOGN = 20;
const ll MAXN = 2e5 + 100;
vector<vector<int>> graph;
int city[MAXN], marked[MAXN], sz[MAXN], vis[MAXN], cVis[MAXN];
vector<int> seen, v[MAXN];
queue<int> q;
int get_sz(int node, int parent) {
sz[node] = 1;
for (auto u : graph[node]) {
if (u == parent || marked[u])
continue;
sz[node] += get_sz(u, node);
}
return sz[node];
}
int find_centro(int node, int parent, int n) {
for (auto u : graph[node]) {
if (u != parent && !marked[u] && sz[u] * 2 >= n)
return find_centro(u, node, n);
}
return node;
}
int par[MAXN], last[MAXN];
void dfs(int node, int parent, int c) {
last[node] = c;
vis[node] = false;
seen.push_back(city[node]);
for (auto u : graph[node]) {
if (parent != u && !marked[u]) {
par[u] = node;
dfs(u, node, c);
}
}
}
int ans;
int cnt;
void decompose(int node) {
int n = get_sz(node, node);
int centro = find_centro(node, node, n);
marked[centro] = true;
last[centro] = centro;
q = queue<int>();
seen.clear();
seen.push_back(city[centro]);
for (auto u : graph[centro]) {
if (!marked[u]) {
par[u] = centro;
dfs(u, centro, centro);
}
}
for (auto u : seen)
cVis[u] = false;
cnt = 0;
q.push(city[centro]);
bool control = true;
while (!q.empty()) {
int c = q.front();
q.pop();
if (cVis[c])
continue;
cVis[c] = true;
cnt++;
for (auto u : v[c]) {
if (last[u] != centro) {
control = false;
break;
}
int now = u;
while (now != centro) {
if (vis[now])
break;
vis[now] = true;
q.push(city[now]);
now = par[now];
}
}
}
if (control)
ans = min(ans, cnt - 1);
for (auto u : graph[centro]) {
if (!marked[u])
decompose(u);
}
}
void dfs3(int node, int parent) {
v[city[node]].push_back(node);
for (auto u : graph[node]) {
if (u == parent)
continue;
dfs3(u, node);
}
}
int main() {
fast
int N, K, A, B;
cin >> N >> K;
ans = N;
graph = vector<vector<int>>(N+1, vector<int>());
for (int i = 1; i < N; i++) {
cin >> A >> B;
graph[A].push_back(B);
graph[B].push_back(A);
}
for (int i = 1; i <= N; i++)
cin >> city[i];
dfs3(1, 1);
decompose(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... |