제출 #1155900

#제출 시각아이디문제언어결과실행 시간메모리
1155900Pekiban수도 (JOI20_capital_city)C++20
41 / 100
3088 ms37760 KiB
#include <bits/stdc++.h>

using namespace std;
#define pb push_back

const int N = 2e5 + 5;
vector<int> g[N], h[N];
int sz[N], c[N], p[N];
bool vis[N], visC[N], er[N];

void dfssz(int s, int e = -1) {
    sz[s] = 1;
    for (auto u : g[s]) {
        if (u == e || vis[u]) continue;
        dfssz(u, s);
        sz[s] += sz[u];
    }
}
int centroid(int s, int n, int e = -1) {
    for (auto u : g[s]) {
        if (u == e || vis[u])   continue;
        if (sz[u] > n/2)    return centroid(u, n, s);
    }
    return s;
}
void dfsroot(int s, int e = -1) {
    for (auto u : g[s]) {
        if (u == e || vis[u])   continue;
        p[u] = s;
        dfsroot(u, s);
    }
}
int ans = 1e9;
void solve(int R, int n) {
    dfssz(R, n);
    int nd = centroid(R, n);
    dfsroot(nd);
    // cout << R << ' ' << nd << ' ' << nd <<
    if (!er[c[nd]]) {
        queue<int> Q; Q.push(c[nd]);
        vector<int> cl = {c[nd]};
        visC[c[nd]] = 1;
        bool ok = 1;
        while (!Q.empty() && ok) {
            int C = Q.front(); Q.pop();
            for (auto u : h[C]) {
                if (u == nd)    continue;
                int v = p[u];
                while (!visC[c[v]]) {
                    if (er[c[v]]) {
                        ok = 0;
                        break;
                    }
                    visC[c[v]] = 1;
                    Q.push(c[v]);
                    cl.pb(c[v]);
                    v = p[v];
                }
            }
        }
        er[c[nd]] = 1;
        for (auto i : cl)   visC[i] = 0;
        if (ok) ans = min(ans, (int)cl.size() - 1);
    }
    vis[nd] = 1;
    for (auto u : g[nd]) {
        if (vis[u]) continue;
        solve(u, sz[u]);
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, k;
    cin >> n >> k;
    for (int i = 1; i < n; ++i) {
        int u, v;
        cin >> u >> v;
        g[u].pb(v); g[v].pb(u);
    }
    for (int i = 1; i <= n; ++i) {
        cin >> c[i];
        h[c[i]].pb(i);
    }
    solve(1, n);
    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...