제출 #98870

#제출 시각아이디문제언어결과실행 시간메모리
98870robot_dreamsBosses (BOI16_bosses)C++17
67 / 100
1569 ms1016 KiB
#include <bits/stdc++.h> #define F first #define S second #define forn(i, n) for (int i = 0; i < int(n); i++) using namespace std; using ll = long long; using pll = pair<ll, ll>; pll dfs(vector<vector<int>>& tree, int v) { ll child_sum = 0, subtree_sum = 0; for (int w : tree[v]) { pll p = dfs(tree, w); child_sum += p.F; subtree_sum += p.S; } ll salary = child_sum + 1; return {salary, subtree_sum + salary}; } int main() { ios_base::sync_with_stdio(false); cout << setprecision(12); cin.tie(nullptr); int n; cin >> n; vector<vector<int>> adj(n); forn(v, n) { int k; cin >> k; forn(i, k) { int u; cin >> u; u--; adj[u].push_back(v); } } ll ans = LLONG_MAX; queue<int> q; vector<bool> visited; vector<vector<int>> tree; forn(root, n) { visited.assign(n, false); tree.assign(n, {}); q.push(root); visited[root] = true; int num_visited = 1; while (!q.empty()) { int v = q.front(); q.pop(); for (int w : adj[v]) { if (visited[w]) continue; tree[v].push_back(w); q.push(w); visited[w] = true; num_visited++; } } if (num_visited == n) ans = min(ans, dfs(tree, root).S); } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...