NOIP2013 車站分級
阿新 • • 發佈:2019-02-20
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int Tmax=1005;
int n,m,in[Tmax],notwait[Tmax],wait[Tmax],ans;
queue<int> q,buffer;
bool Edge[Tmax][Tmax];
void toposort()
{
int i,j,t;
for(i=1;i<=n;i++)
if (!in[i]) q.push(i);
while(!q.empty())
{
t=q.front();
q.pop();
for(j=1;j<=n;j++)
if(Edge[t][j]&&--in[j]==0) buffer.push(j);
if(q.empty()){
ans++;
swap(q,buffer);
}
}
return;
}
void add()
{
for(int i=1 ;i<=notwait[0];i++)
for(int j=1;j<=wait[0];j++)
if(!Edge[notwait[i]][wait[j]]){
Edge[notwait[i]][wait[j]]=true;
in[wait[j]]++;
}
return;
}
int main()
{
int i,a,b,j,num;
scanf("%d %d",&n,&m);
for(i=1;i<=m;i++)
{
scanf ("%d",&a);
notwait[0]=wait[0]=0;
for(j=1;j<=a;j++)
{
scanf("%d",&b);
if(j==1) num=b;
while(num!=b){
notwait[++notwait[0]]=num;
num++;
}
wait[++wait[0]]=b;
num++;
}
add();
}
toposort();
printf("%d",ans);
return 0;
}