这道题有拓扑排序的思想,题目中给出级别大于或者等于的火车站都得停下来。换言之没有停下来的等级就是比他小,我们要求出最大的层数。
求层数也有点像bfs了
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int e[maxn][maxn];
int ru[maxn];
int n,m;
queue<pair<int,int> > q;
int topu(){
for(int i=1;i<=n;i++){
if(!ru[i]){
q.push(make_pair(i,1));
}
}
int ans=1;
while(!q.empty()){
int d=q.front().first;
int val=q.front().second;
q.pop();
for(int i=1;i<=n;i++){
if(!e[i][d])continue;
ru[i]--;
if(!ru[i]){
q.push(make_pair(i,val+1));
ans=max(ans,val+1);
}
}
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int k=1;k<=m;k++){
int t;
scanf("%d",&t);
int ok[maxn];
int s[maxn];
memset(ok,0,sizeof(ok));
for(int i=1;i<=t;i++)
{
scanf("%d",&s[i]);
ok[s[i]]=1;
}
for(int i=1;i<=t;i++){
for(int j=s[1];j<=s[t];j++){
if(ok[j]||e[s[i]][j])continue;
e[s[i]][j]=1;
ru[s[i]]++;
}
}
}
printf("%d\n",topu());
return 0;
}