#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |