Submission #1313569

#TimeUsernameProblemLanguageResultExecution timeMemory
1313569glupanBosses (BOI16_bosses)C++20
100 / 100
956 ms1056 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int MAX_N = 5005; const int MOD = 998244353; vector<int>adj[MAX_N]; int visited[MAX_N],parent[MAX_N]; ll mark[MAX_N],ans=1e18; void dfs(int s) { ll cnt=0; for(auto u : adj[s]) { dfs(u); cnt += mark[u]; } mark[s] = cnt+1; } void solve(int n, int TMP) { queue<int>q; q.push(TMP); while(!q.empty()) { int v = q.front(); q.pop(); for(auto u : adj[v]) { if(!parent[u]) { q.push(u); parent[u] = v; } } } for(int i=1; i<=n; i++) { if(!visited[i] and !parent[i]) { q.push(i); visited[i] = 1; if(i == TMP) parent[i] = 1e5; } while(!q.empty()) { int v = q.front(); q.pop(); for(auto u : adj[v]) { if(!parent[u]) { q.push(u); parent[u] = v; } } } } for(int i=1; i<=n; i++) adj[i].clear(); for(int i=1; i<=n; i++) { if(i == TMP) continue; adj[parent[i]].push_back(i); } dfs(TMP); for(int i=1; i<=n; i++) { if(!mark[i]) return; } ll brojac=0; for(int i=1; i<=n; i++) brojac += mark[i]; ans=min(ans,brojac); } int main() { ios::sync_with_stdio(false); cin.tie(NULL); vector<int>Adj[MAX_N]; int n; cin >> n; int ROOT=0; for(int i=0; i<n; i++) { int k; cin >> k; if(k == 0) ROOT = i+1; for(int j=0; j<k; j++) { int x; cin >> x; adj[x].push_back(i+1); Adj[x].push_back(i+1); } } if(ROOT) { solve(n,ROOT); } else { for(int root=1; root<=n; root++) { solve(n, root); for(int i=1; i<=n; i++) adj[i] = Adj[i]; memset(parent,0,sizeof parent); memset(visited,0,sizeof visited); memset(mark,0,sizeof mark); } } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...