1. 程式人生 > >NOIP2013 車站分級

NOIP2013 車站分級

#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; }