Submission #1208585

#TimeUsernameProblemLanguageResultExecution timeMemory
1208585ml_tssBosses (BOI16_bosses)C++20
67 / 100
1594 ms1196 KiB
#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() {
    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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...