1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <bits/stdc++.h>
using namespace std;

using ll = int64_t;

void solve() {
  int k, n1;
  cin >> k >> n1;

  vector<vector<int>> graph(n1);
  vector<int> pos(n1);

  int offset = 0;

  for(int i = 1; i < k; i++) {
    int nextOffset = graph.size();

    int n;
    cin >> n;
    for(int j = 0; j < n; j++) {
      int v;
      cin >> v;
      graph.push_back({});
      pos.push_back(i);

      if(v != 0) {
        graph[v - 1 + offset].push_back(graph.size() - 1);
      }
    }

    offset = nextOffset;
  }

  vector<bool> visited(graph.size());

  vector<int> vs(k + 2);

  auto dfs = [&] (int i, auto&& dfs) -> int  {
    visited[i] = true;

    if(graph[i].size() == 0) {
      vs[pos[i] + 1]++;
      return 1;
    }

    int sum = 0;
    for(int nei : graph[i]) {
      sum += dfs(nei, dfs);
    }

    return sum;
  };

  for(int i = 0; i < graph.size(); i++) {
    if(!visited[i]) {
      vs[pos[i]] -= dfs(i, dfs);
    }
  }

  int ans = 0;
  int got = 0;
  for(auto v : vs) {
    if(got + v < 0) {
      int need = -(v + got);
      got += need;
      ans += need;
    }
    got += v;
  }

  cout << ans;
}

int main() {
  // freopen("in", "r", stdin);

  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  solve();
}