제출 #98871

#제출 시각아이디문제언어결과실행 시간메모리
98871robot_dreamsBosses (BOI16_bosses)C++17
67 / 100
1529 ms1008 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; stack<pair<int, bool>> s; vector<ll> salary, subtree; 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) continue; salary.assign(n, 0); subtree.assign(n, 0); s.emplace(root, false); while (!s.empty()) { auto p = s.top(); s.pop(); int v = p.F; bool done = p.S; if (done) { salary[v] = 1; for (int w : tree[v]) { salary[v] += salary[w]; subtree[v] += subtree[w]; } subtree[v] += salary[v]; } else { s.emplace(v, true); for (int w : tree[v]) s.emplace(w, false); } } ans = min(ans, subtree[root]); } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...