Submission #999176

#TimeUsernameProblemLanguageResultExecution timeMemory
999176snpmrnhlolCapital City (JOI20_capital_city)C++17
100 / 100
353 ms35412 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5;
const int inf = 2e9;
vector <int> e[N];
int v[N];
int sub[N];
vector <int> pos[N];
bool bad[N];
bool tree[N];
bool vis[N];
bool vis2[N];
int ans = inf;
int pr[N];
void cendecomp(int node){
    int sz = 0;
    int cen = -1,mn = inf;
    auto dfs = [&](auto self, int node, int p) -> void{
        for(auto i:e[node]){
            if(i == p || bad[i])continue;
            self(self, i, node);
        }
        sz++;
    };
    auto dfs2 = [&](auto self, int node, int p) -> void{
        int mx = -1;
        sub[node] = 1;
        for(auto i:e[node]){
            if(i == p || bad[i])continue;
            self(self, i, node);
            sub[node]+=sub[i];
            mx = max(mx,sub[i]);
        }
        mx = max(mx,sz - sub[node]);
        if(mx < mn){
            mn = mx;
            cen = node;
        }
    };
    auto dfs3 = [&](auto self, int node, int p) -> void{
        vis[node] = 0;
        tree[node] = 0;
        vis2[v[node]] = 0;
        for(auto i:e[node]){
            if(i == p || bad[i])continue;
            self(self, i, node);
        }
    };
    auto dfs4 = [&](auto self, int node, int p) -> void{
        pr[node] = p;
        tree[node] = 1;
        for(auto i:e[node]){
            if(i == p || bad[i])continue;
            self(self, i, node);
        }
    };
    dfs(dfs, node, -1);
    dfs2(dfs2, node, -1);
    dfs4(dfs4, cen, -1);
    queue <int> q;
    q.push(cen);
    vis[cen] = 1;
    bool ok = 1;
    int nr = 0;
    while(!q.empty()){
        int x = q.front();
        //cout<<"investigate:"<<x<<'\n';
        q.pop();
        if(!vis2[v[x]]){
            vis2[v[x]] = 1;
            nr++;
            for(auto i:pos[v[x]]){
                if(!tree[i]){
                    ok = 0;
                    break;
                }
                if(tree[i] && !vis[i]){
                    vis[i] = 1;
                    q.push(i);
                }
            }
            if(!ok)break;
        }
        if(pr[x] != -1 && !vis[pr[x]]){
            vis[pr[x]] = 1;
            q.push(pr[x]);
        }
    }
    if(ok){
        ans = min(ans,nr);
    }
    dfs3(dfs3, cen, -1);
    //cout<<cen<<' '<<nr<<' '<<ok<<'\n';
    bad[cen] = 1;
    for(auto i:e[cen]){
        if(!bad[i]){
            cendecomp(i);
        }
    }
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,k;
    cin>>n>>k;
    for(int i = 0;i < n - 1;i++){
        int u,w;
        cin>>u>>w;
        u--;w--;
        e[u].push_back(w);
        e[w].push_back(u);
    }
    for(int i = 0;i < n;i++){
        cin>>v[i];
        v[i]--;
        pos[v[i]].push_back(i);
    }
    cendecomp(0);
    cout<<ans - 1<<'\n';
    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...