Submission #365800

#TimeUsernameProblemLanguageResultExecution timeMemory
365800negar_aCapital City (JOI20_capital_city)C++14
1 / 100
1010 ms38120 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define pb push_back #define mp make_pair #define pii pair <int, int> #define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define F first #define S second const int maxn = 2e5 + 5; vector <int> adj[maxn], vec[maxn]; int sz[maxn], par[maxn], c[maxn]; int ans; bool cent[maxn], mark[maxn], com[maxn], visit[maxn]; void dfs(int v, int p = -1){ sz[v] = 1; com[v] = true; for(int u : adj[v]){ if(!cent[u] && u != p){ dfs(u, v); sz[v] += sz[u]; } } } int find_centroid(int v, int s, int p = -1){ for(int u : adj[v]){ if(!cent[u] && u != p && sz[u] > s / 2){ return find_centroid(u, s, v); } } return v; } void dfs2(int v, int p = -1){ for(int u : adj[v]){ if(!cent[u] && u != p){ par[u] = v; dfs2(u, v); } } } void clean(int v, int p = -1){ com[v] = false; par[v] = 0; sz[v] = 0; for(int u : adj[v]){ if(u != p && !cent[u]) clean(u, v); } } void solve(int v){ dfs(v); int cn = find_centroid(v, sz[v]); // cout << "cen : " << cn << endl; par[cn] = -1; dfs2(cn); queue <int> q; vector <int> vc; q.push(c[cn]); bool flag = true; mark[c[cn]] = true; while(q.size() && flag){ int x = q.front(); q.pop(); vc.pb(x); if(visit[x]) flag = false; for(int u : vec[x]){ if(!com[u]){ flag = false; break; } if(par[u] != -1 && !mark[c[par[u]]]){ if(!com[par[u]]){ flag = false; break; } q.push(c[par[u]]); mark[c[par[u]]] = true; } } } visit[c[cn]] = true; if(flag){ ans = min(ans, (int)vc.size() - 1); } //clear for(int u : vc) mark[u] = false; clean(v); cent[cn] = true; for(int u : adj[cn]){ if(!cent[u]){ solve(u); } } } int main(){ fast_io; int n, k; cin >> n >> k; for(int i = 0; i < n - 1; i ++){ int x, y; cin >> x >> y; x --; y --; adj[x].pb(y); adj[y].pb(x); } for(int i = 0; i < n; i ++){ cin >> c[i]; vec[c[i]].pb(i); } ans = k - 1; solve(0); cout << ans; return 0; } /* 6 3 2 1 3 5 6 2 3 4 2 3 1 3 1 2 3 2 8 4 4 1 1 3 3 6 6 7 7 2 2 5 5 8 2 4 3 1 1 2 3 4 12 4 7 9 1 3 4 6 2 4 10 12 1 2 2 10 11 1 2 8 5 3 6 7 3 1 1 2 4 3 3 2 2 3 4 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...