我是采用一层一层更新的方法,对于当前列车,在他走的区间内,找到没有停靠的站点的最大值Max。然后将所有停靠的站点和Max比较,如果有站点的级别不高于Max,就给这个站点的级别赋值为Max+1。开始我只是遍历了一遍所有的列车,就wa了,应该在重复遍历,用flag标记,直到没有跟新站点的级别就可以break了。
其实和拓扑排序的思想差不多,但是自己确实没想到拓扑排序。。。
#include <bits/stdc++.h>
using namespace std;
#define res register int
#define inf 0x3f3f3f3f
const int maxn=1005;
vector<int> v[maxn];
int num[maxn];
int vis[maxn];
int N,M;
int ans=0;
void slove()
{
while(1){
int flag=1;
for(res i=0;i<M;i++){
int size=v[i].size();
for(res j=0;j<size;j++)//对于本次出现的数据进行标记
vis[v[i][j]]=1;
int Max=-inf;
for(res j=v[i][0]+1;j<v[i][size-1];j++)
if(!vis[j]) Max=max(Max,num[j]);
for(res j=v[i][0];j<=v[i][size-1];j++){
if(vis[j]&&Max>=num[j]){
num[j]=Max+1;
flag=0;
}
}
for(res j=0;j<size;j++)//褪去标记
vis[v[i][j]]=0;
}
if(flag) break;
}
}
void init()
{
scanf("%d%d",&N,&M);
int cnt,to;
for(res i=0;i<M;i++){
scanf("%d",&cnt);
for(res j=0;j<cnt;j++){
scanf("%d",&to);
v[i].push_back(to);
}
}
}
int main()
{
init();
slove();
int Max=-inf;
for(res i=1;i<=N;i++)
Max=max(Max,num[i]);
printf("%d",Max+1);
return 0;
}