fork(1) download
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cstdio>
  5.  
  6. using namespace std;
  7.  
  8. #define pb push_back
  9. #define mp make_pair
  10. #define fi first
  11. #define se second
  12. #define FOR(i,a,b) for(int i=(a);i<(b);++i)
  13. #define rep(i,n) FOR(i,0,n)
  14.  
  15. struct edge{
  16. int to, id;
  17. edge(int to, int id) : to(to), id(id){}
  18. edge(){}
  19. };
  20.  
  21. struct unionfind {
  22. vector<int> par, rank;
  23.  
  24. void init(int n) {
  25. par.resize(n);
  26. rank.resize(n);
  27.  
  28. for(int i = 0; i < n; i++) {
  29. par[i] = i;
  30. rank[i] = 0;
  31. }
  32. }
  33.  
  34. int find(int x) {
  35. if(par[x] == x) return x;
  36. else return par[x] = find(par[x]);
  37. }
  38.  
  39. void unite(int x, int y) {
  40. x = find(x);
  41. y = find(y);
  42. if(x == y) return ;
  43.  
  44. if(rank[x] < rank[y]) par[x] = y;
  45. else{
  46. par[y] = x;
  47. if(rank[x] == rank[y]) ++rank[x];
  48. }
  49. }
  50.  
  51. bool same(int x, int y) { return (find(x) == find(y)); }
  52. } uf;
  53.  
  54. int n;
  55. int now;
  56. vector<edge> g[5010];
  57. vector<edge> in[5010];
  58. bool vis[5010];
  59. vector<int> v[5010];
  60. vector<int> gg[100010];
  61. int dp[100010];
  62. vector<int> vs;
  63. vector<int> em;
  64.  
  65. void predfs(int v){
  66. vis[v] = true;
  67. rep(i, g[v].size()){
  68. in[g[v][i].to].pb(edge(v, g[v][i].id));
  69. if(!vis[g[v][i].to]) predfs(g[v][i].to);
  70. }
  71. }
  72.  
  73. void dfs(int v){
  74. vis[v] = true;
  75. rep(i, gg[v].size()){
  76. if(!vis[gg[v][i]]) dfs(gg[v][i]);
  77. }
  78. vs.pb(v);
  79. }
  80.  
  81. int main(){
  82. scanf("%d", &n);
  83.  
  84. rep(i, n - 1){
  85. int k;
  86. scanf("%d", &k);
  87. g[i].resize(k);
  88. rep(j, k){
  89. int x;
  90. scanf("%d", &x);
  91. --x;
  92. g[i][j] = edge(x, now++);
  93. }
  94. }
  95.  
  96. predfs(0);
  97. rep(i, n) reverse(in[i].begin(), in[i].end());
  98. uf.init(now * 2);
  99.  
  100. rep(i, n){
  101. rep(j, in[i].size()){
  102. v[i].pb(in[i][j].id * 2 + 1);
  103. v[i].pb(in[i][j].id * 2);
  104. }
  105.  
  106. rep(j, g[i].size()){
  107. v[i].pb(g[i][j].id * 2);
  108. v[i].pb(g[i][j].id * 2 + 1);
  109. }
  110.  
  111. rep(j, (int)v[i].size() / 2 - 1){
  112. uf.unite(v[i][j * 2 + 1], v[i][j * 2 + 2]);
  113. }
  114. uf.unite(v[i][0], v[i].back());
  115. }
  116.  
  117. rep(i, now * 2) em.pb(uf.find(i));
  118. sort(em.begin(), em.end());
  119. em.erase(unique(em.begin(), em.end()), em.end());
  120.  
  121.  
  122. rep(i, n){
  123. rep(j, g[i].size()){
  124. int u = uf.find(g[i][j].id * 2);
  125. u = lower_bound(em.begin(), em.end(), u) - em.begin();
  126. int v = uf.find(g[i][j].id * 2 + 1);
  127. v = lower_bound(em.begin(), em.end(), v) - em.begin();
  128. if(v != 0) gg[u].pb(v);
  129. }
  130. }
  131.  
  132. rep(i, em.size()){
  133. sort(gg[i].begin(), gg[i].end());
  134. gg[i].erase(unique(gg[i].begin(), gg[i].end()), gg[i].end());
  135. }
  136.  
  137. memset(vis, 0, sizeof(vis));
  138. rep(i, em.size()){
  139. if(vis[i] || !gg[i].size()) continue;
  140. dfs(i);
  141. }
  142. reverse(vs.begin(), vs.end());
  143.  
  144. dp[0] = 1;
  145. rep(i, vs.size()) rep(j, gg[vs[i]].size()) dp[gg[vs[i]][j]] = max(dp[gg[vs[i]][j]], dp[vs[i]] + 1);
  146.  
  147. printf("%d\n", *max_element(dp, dp + (int)em.size()));
  148. return 0;
  149. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘void predfs(int)’:
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:67:5: note: in expansion of macro ‘rep’
     rep(i, g[v].size()){
     ^
prog.cpp: In function ‘void dfs(int)’:
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:75:5: note: in expansion of macro ‘rep’
     rep(i, gg[v].size()){
     ^
prog.cpp: In function ‘int main()’:
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:101:2: note: in expansion of macro ‘rep’
  rep(j, in[i].size()){
  ^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:106:2: note: in expansion of macro ‘rep’
  rep(j, g[i].size()){
  ^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:123:2: note: in expansion of macro ‘rep’
  rep(j, g[i].size()){
  ^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:132:5: note: in expansion of macro ‘rep’
     rep(i, em.size()){
     ^
prog.cpp:137:31: error: ‘memset’ was not declared in this scope
     memset(vis, 0, sizeof(vis));
                               ^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:138:5: note: in expansion of macro ‘rep’
     rep(i, em.size()){
     ^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:145:5: note: in expansion of macro ‘rep’
     rep(i, vs.size()) rep(j, gg[vs[i]].size()) dp[gg[vs[i]][j]] = max(dp[gg[vs[i]][j]], dp[vs[i]] + 1);
     ^
prog.cpp:12:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a,b) for(int i=(a);i<(b);++i)
                                      ^
prog.cpp:13:19: note: in expansion of macro ‘FOR’
 #define rep(i,n)  FOR(i,0,n)
                   ^
prog.cpp:145:23: note: in expansion of macro ‘rep’
     rep(i, vs.size()) rep(j, gg[vs[i]].size()) dp[gg[vs[i]][j]] = max(dp[gg[vs[i]][j]], dp[vs[i]] + 1);
                       ^
stdout
Standard output is empty