NOIP2013 车站分级

来源:互联网 发布:excell复数矩阵求逆 编辑:程序博客网 时间:2024/04/27 16:30

题目:http://www.luogu.org/problem/show?pid=1983
分析:对于每趟,不经过的指向经过的,代表级别比自身大。拓扑排序,则同一时间入度为0的为同一级别。
代码:

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