Submission #1324038

#TimeUsernameProblemLanguageResultExecution timeMemory
1324038sh_qaxxorov_571Bosses (BOI16_bosses)C++20
100 / 100
365 ms716 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

/**
 * Har bir xodimni ildiz sifatida tekshirib chiqamiz.
 * Jami ish haqi yig'indisi har bir tugunning chuqurlik darajalari yig'indisiga teng.
 */

const long long INF = 1e18;
vector<int> adj[5005]; // Boss bo'lishi mumkin bo'lganlar ro'yxati (teskari graf)

long long solve(int root, int n) {
    vector<int> dist(n + 1, -1);
    queue<int> q;

    dist[root] = 1; // Ildizning ish haqi darajasi 1 dan boshlanadi
    q.push(root);

    long long total_salary = 0;
    int visited_count = 0;

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        visited_count++;
        total_salary += dist[u];

        for (int v : adj[u]) {
            if (dist[v] == -1) {
                dist[v] = dist[u] + 1;
                q.push(v);
            }
        }
    }

    // Agar barcha xodimlar iyerarxiyaga kirmagan bo'lsa, bu ildiz yaroqsiz
    if (visited_count != n) return INF;
    return total_salary;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    if (!(cin >> n)) return 0;

    for (int i = 1; i <= n; i++) {
        int k;
        cin >> k;
        while (k--) {
            int boss;
            cin >> boss;
            // Xodim i bossni qabul qiladi, demak bossdan i ga yo'l bor
            adj[boss].push_back(i);
        }
    }

    long long min_total_salary = INF;

    // Har bir xodimni potensial "Bosh Boss" (ildiz) sifatida ko'rib chiqamiz
    for (int i = 1; i <= n; i++) {
        min_total_salary = min(min_total_salary, solve(i, n));
    }

    cout << min_total_salary << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...