从起点到终点,只会在大于等于它等级的站点停靠,则小于它的不停靠
就从小于它的连一条边到它,然后拓扑
#include <bits/stdc++.h>
#define pir pair<int,int>
using namespace std;
const int N = 1050;
int in[N],n,m,ans;
int book[N][N],s[N][N];
int vis[N];
queue<pir> q;
vector<int> g[N];
int read(){
int x=0,dign=1;
char c = getchar();
while(c<'0'||c>'9'){
if(c=='-')dign=-1;
c = getchar();
}
while(c>='0'&&c<='9'){
x = x*10+c-'0';
c = getchar();
}
return x*dign;
}
void spfa(){
for(int i=1;i<=n;i++)if(!in[i])q.push(make_pair(i,1));//入度为0最低级1
ans = 1;
while(!q.empty()){
int u = q.front().first;
int val = q.front().second;q.pop();
for(int i=0;i<g[u].size();i++){
{
in[g[u][i]]--;
if(!in[g[u][i]])
{q.push(make_pair(g[u][i],val+1));
ans = max(val+1,ans);
}
}
}
}
}
int main()
{
n = read(); m = read();
for(int i=1;i<=m;i++){
s[i][0] = read();
memset(vis,0,sizeof(vis));
for(int j=1;j<=s[i][0];j++){
s[i][j] = read();
vis[s[i][j]] = 1;//在s[i][j]点停靠
}
for(int j=1;j<=s[i][0];j++)
for(int k=s[i][1];k<=s[i][s[i][0]];k++)
{
if(vis[k])continue;
{//对每条路
//起点到终点
if(!book[k][s[i][j]]){
book[k][s[i][j]]=1;//连一条k到s[i][j]的路
in[s[i][j]]++;
g[k].push_back(s[i][j]);
}
}
}
}
spfa();
printf("%d\n",ans);
return 0;
}