https://www.luogu.com.cn/problem/P1983
#include <bits/stdc++.h>
using namespace std;
int n, m;
int li[1001];
bool to[1001][1001];
bool en[1001];
int input_cnt[1001];
int deep[1001];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int t;
scanf("%d", &t);
for (int j = 1; j <= t; j++)//将经过的车站读入
scanf("%d", &li[j]);
for (int j = li[1]; j <= li[t]; j++)//将始发站到终点站的标记清空
en[j] = 0;
for (int j = 1; j <= t; j++)//经过的车站标记为1
en[li[j]] = 1;
for (int j = li[1]; j <= li[t]; j++) {//经过的车站的级别比未经过的级别大,将经过的车站连向未经过的车站
if (en[j] == 1)//如果该站经过则跳过
continue;
else {//找到了未经过的车站
for (int k = 1; k <= t; k++) {//将所有经过过的车站与该未经过的车站相连
if (!to[li[k]][j]) {//如果边没有被添加过则添加
to[li[k]][j] = 1;//添加边
input_cnt[j]++;//入读+1
}
}
}
}
}
queue<int> que;
for (int i = 1; i <= n; i++) {
if (input_cnt[i] == 0) {
deep[i] = 1;//初始深度为1
que.push(i);
}
}
int ans = 0;
while (!que.empty()) {
int u = que.front();
que.pop();
for (int v = 1; v <= n; v++) {
if(!to[u][v])//不存在边,跳过
continue;
input_cnt[v]--;//存在边,让目标入度-1
deep[v] = max(deep[v], deep[u] + 1);//更新目标的最大深度
ans = max(ans, deep[v]);//以全体的最大深度作为答案
if (input_cnt[v] == 0)
que.push(v);
}
}
printf("%d", ans);
}