#include <iostream>
#include <map>
#include <vector>
using namespace std;
using pii = pair<long long, long long>;
const long long MAXK = 500005;
map<pii, vector<long long>> connections;
map<pii, bool> visited;
vector<long long> sizes;
vector<long long> edges[MAXK];
void leaf_set()
{
for (long long i = 0; i < sizes.size(); i++)
{
for (long long j = 0; j < sizes[i]; j++)
{
if (connections[make_pair(i, j)].empty())
edges[i][j] = 1;
}
}
}
void dfs(long long x, long long y)
{
visited[make_pair(x, y)] = true;
for (auto it = connections[make_pair(x, y)].begin(); it != connections[make_pair(x, y)].end(); it++)
{
// coords --> {x + 1, it}
dfs(x + 1, *it);
edges[x][y] += edges[x + 1][*it];
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
long long k, N0;
cin >> k >> N0;
sizes.push_back(N0);
edges[0].reserve(k + 5);
for (long long i = 1; i < k; i++)
{
long long Ni;
cin >> Ni;
edges[i].reserve(Ni);
sizes.push_back(Ni);
for (long long j = 0; j < Ni; j++)
{
long long c;
cin >> c;
if (c == 0)
continue;
connections[make_pair(i - 1, c - 1)].push_back(j);
}
}
// cerr << "sizes = ";
// for (long long i = 0; i < sizes.size(); i++)
// cerr << sizes[i] << " ";
// cerr << endl;
// for (long long i = 0; i < k; i++)
// {
// for (long long j = 0; j < sizes[i]; j++)
// {
// cerr << "connections[" << i << ", " << j << "] = ";
// for (auto it = connections[make_pair(i, j)].begin(); it != connections[make_pair(i, j)].end(); it++)
// cerr << *it << " ";
// cerr << endl;
// }
// }
// cerr << endl;
leaf_set();
// for (long long i = 0; i < k; i++)
// {
// for (long long j = 0; j < sizes[i]; j++)
// {
// cerr << "edges[" << i << "][" << j << "] = " << edges[i][j] << endl;
// }
// cerr << endl;
// }
for (long long i = 0; i < k; i++)
{
for (long long j = 0; j < sizes[i]; j++)
{
if (!visited[make_pair(i, j)])
{
dfs(i, j);
}
}
}
// cerr << "after dfs\n\n\n\n\n\n\n";
// for (long long i = 0; i < k; i++)
// {
// for (long long j = 0; j < sizes[i]; j++)
// {
// cerr << "edges[" << i << "][" << j << "] = " << edges[i][j] << endl;
// }
// cerr << endl;
// }
long long result = 0;
for (long long i = 0; i < k; i++)
{
long long sum = 0;
for (long long j = 0; j < sizes[i]; j++)
sum += edges[i][j];
result = max(result, sum);
}
cout << result << endl;
}
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> #include <map> #include <vector> using namespace std; using pii = pair<long long, long long>; const long long MAXK = 500005; map<pii, vector<long long>> connections; map<pii, bool> visited; vector<long long> sizes; vector<long long> edges[MAXK]; void leaf_set() { for (long long i = 0; i < sizes.size(); i++) { for (long long j = 0; j < sizes[i]; j++) { if (connections[make_pair(i, j)].empty()) edges[i][j] = 1; } } } void dfs(long long x, long long y) { visited[make_pair(x, y)] = true; for (auto it = connections[make_pair(x, y)].begin(); it != connections[make_pair(x, y)].end(); it++) { // coords --> {x + 1, it} dfs(x + 1, *it); edges[x][y] += edges[x + 1][*it]; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); long long k, N0; cin >> k >> N0; sizes.push_back(N0); edges[0].reserve(k + 5); for (long long i = 1; i < k; i++) { long long Ni; cin >> Ni; edges[i].reserve(Ni); sizes.push_back(Ni); for (long long j = 0; j < Ni; j++) { long long c; cin >> c; if (c == 0) continue; connections[make_pair(i - 1, c - 1)].push_back(j); } } // cerr << "sizes = "; // for (long long i = 0; i < sizes.size(); i++) // cerr << sizes[i] << " "; // cerr << endl; // for (long long i = 0; i < k; i++) // { // for (long long j = 0; j < sizes[i]; j++) // { // cerr << "connections[" << i << ", " << j << "] = "; // for (auto it = connections[make_pair(i, j)].begin(); it != connections[make_pair(i, j)].end(); it++) // cerr << *it << " "; // cerr << endl; // } // } // cerr << endl; leaf_set(); // for (long long i = 0; i < k; i++) // { // for (long long j = 0; j < sizes[i]; j++) // { // cerr << "edges[" << i << "][" << j << "] = " << edges[i][j] << endl; // } // cerr << endl; // } for (long long i = 0; i < k; i++) { for (long long j = 0; j < sizes[i]; j++) { if (!visited[make_pair(i, j)]) { dfs(i, j); } } } // cerr << "after dfs\n\n\n\n\n\n\n"; // for (long long i = 0; i < k; i++) // { // for (long long j = 0; j < sizes[i]; j++) // { // cerr << "edges[" << i << "][" << j << "] = " << edges[i][j] << endl; // } // cerr << endl; // } long long result = 0; for (long long i = 0; i < k; i++) { long long sum = 0; for (long long j = 0; j < sizes[i]; j++) sum += edges[i][j]; result = max(result, sum); } cout << result << endl; } |
English