```cpp
//解决了...QAQ
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define QAQ main
using namespace std;
const int maxn=1000+5;
int n,m;
bool g[maxn][maxn];
int d[maxn];
struct Node{
int num;
int level;
}edge;
queue<Node> que;
int ans=0;
void init(){
memset(g,0,sizeof(g));
memset(d,0,sizeof(d));
while(!que.empty()) que.pop();
scanf("%d%d",&n,&m);
for(int lll=1;lll<=m;lll++){
int h[maxn],l[maxn]; memset(h,0,sizeof(h)); memset(l,0,sizeof(l));
scanf("%d",&h[0]);
for(int i=1;i<=h[0];i++) scanf("%d",&h[i]);
l[0]=1;
for(int i=1;i<=h[0];i++)
for(int j=h[i]+1;j<h[i+1];j++) l[l[0]++]=j;
for(int i=1;i<=h[0];i++)
for(int j=1;j<=l[0];j++)
if(g[h[i]][l[j]]==false){
g[h[i]][l[j]]=true; d[l[j]]++;
}
}
}
void qwq(){
for(int i=1;i<=n;i++)
if(d[i]==0){
edge.num=i; edge.level=1; que.push(edge);
}
while(!que.empty()){
if(ans<que.front().level) ans++;
for(int i=1;i<=n;i++)
if(g[que.front().num][i]){
d[i]--;
if(d[i]==0){
edge.num=i; edge.level=que.front().level+1; que.push(edge);
}
}
que.pop();
}
printf("%d\n",ans);
}
int QAQ(){
init();
qwq();
return 0;
}
```
by DavidLI @ 2017-10-16 20:25:11
然而你的过程名已经成功引起了我的注意
by 蒻得不行 @ 2017-11-07 22:57:40