제출 #1208446

#제출 시각아이디문제언어결과실행 시간메모리
1208446tgirolami09Bosses (BOI16_bosses)C++20
100 / 100
459 ms724 KiB
#include <iostream>
#include <vector>
#include <queue>

typedef long long ll;

using namespace std;

vector<int> children[5001];

struct person{
    int personId;
    int parentDepth;
};

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

    int nbPeople;
    cin >> nbPeople;

    for (int i = 0;i<nbPeople;++i){
        int nbBosses;
        cin >> nbBosses;
        for (int j = 0;j<nbBosses;++j){
            int boss;
            cin >> boss;
            children[boss].push_back(i+1);
        }
    }

    //Try everyone as a boss first
    ll bestSum = 1l<<60;
    for (int i = 1;i<=nbPeople;++i){
        // printf("\tNew try\n");
        ll currSum = 0;
        queue<person> toAdd;
        vector<bool> visited(nbPeople+1,false);
        visited[i] = true;
        int toBeVisited = nbPeople-1;
        toAdd.push({i,1});

        while(!(toAdd.empty())){
            person newPerson = toAdd.front();
            toAdd.pop();

            // printf("Added person %d for a cost of %d\n",newPerson.personId,newPerson.parentDepth);
            currSum+=newPerson.parentDepth;

            //Add all children if not seen
            for (int childId : children[newPerson.personId]){
                if (!visited[childId]){
                    visited[childId] = true;
                    --toBeVisited;
                    toAdd.push({childId,newPerson.parentDepth+1});
                }
            }
        }
        if (toBeVisited==0){
            bestSum = min(bestSum,currSum);
        }
    }
    cout << bestSum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...