做法:拓扑。c++
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
return s*w;
}
#define RI /*register*/ int
#define pii pair<int,int>
const int E=1005;
int s[E][E],n,m,ans,in[E],vis[E],tot,pd[E][E];
queue<pii>q;
vector<int>g[E];
int out(int kkk)
{
if(kkk>9)out(kkk/10);
putchar(kkk%10+'0');
}
void bfs()
{
RI i;
for(i=1;i<=n;i++)
if(in[i]==0)q.push(make_pair(i,1));
ans=1;
while(!q.empty())
{
int u=q.front().first,val=q.front().second;
q.pop();
for(i=0;i<g[u].size();i++)
{
int v=g[u][i];
in[v]--;
if(in[v]==0)
{
q.push(make_pair(v,val+1));
ans=max(ans,val+1);
}
}
}
}
int main()
{
RI i,j;
n=read();m=read();
for(i=1;i<=m;i++)
{
s[i][0]=read();
memset(vis,-1,sizeof(vis));
for(j=1;j<=s[i][0];j++)
{
s[i][j]=read();
vis[s[i][j]]=1;
}
for(j=s[i][1];j<=s[i][s[i][0]];j++)
{
if(vis[j]==1)continue;
for(RI k=1;k<=s[i][0];k++)
if(pd[j][s[i][k]]==0)
{
in[s[i][k]]++;
g[j].push_back(s[i][k]);
pd[j][s[i][k]]=1;
}
}
}
bfs();
out(ans);
return 0;
}