#include <bits/stdc++.h>
using namespace std;
int cost(const vector<int>& parent) {
int n = parent.size();
vector<vector<int>> children(n);
int root = -1;
for (int i = 0; i < n; i++) {
if (parent[i] == 0) {
root = i;
} else {
children[parent[i] - 1].push_back(i);
}
}
vector<int> prices(n);
function<int(int)> dfs = [&](int u) -> int {
int total = 0;
for (int v : children[u]) {
total += dfs(v);
}
prices[u] = total + 1;
return prices[u];
};
dfs(root);
int res = 0;
for (int x : prices) res += x;
return res;
}
int build_tree(int root, unordered_map<int, vector<int>>& constraint) {
int n = constraint.size();
vector<int> tree(n, -1);
queue<int> cur;
tree[root - 1] = 0;
cur.push(root);
while (!cur.empty()) {
int node = cur.front();
cur.pop();
for (int i : constraint[node]) {
if (tree[i - 1] == -1) {
tree[i - 1] = node;
cur.push(i);
}
}
}
for (int val : tree) {
if (val == -1) return INT_MAX;
}
return cost(tree);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int N;
cin >> N;
unordered_map<int, vector<int>> um;
for (int i = 1; i <= N; i++) {
um[i] = {};
}
for (int i = 1; i <= N; i++) {
int c;
cin >> c;
for (int j = 0; j < c; j++) {
int t;
cin >> t;
um[t].push_back(i);
}
}
int mini = INT_MAX;
for (int i = 1; i <= N; i++) {
int val = build_tree(i, um);
if (val < mini) mini = val;
}
cout << mini;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |