车站等级
# Description
常识:
对于一辆火车,我们会规定共始发站的终点站,但这条线路上并不是所有的站点,这个火车都会停靠。
一条单向的铁路线上,依次有编号为1, 2, …, n的n个火车站。每个火车站都有一个级别,最低为1级,最高等级未定,希望你来求出来。
现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠。
(注意:起始站和终点站,也算作事先已知需要停靠的站点)
例如,下表是5趟车次的运行情况。其中,前4趟车次均满足要求,而第5趟车次由于停靠了3号火车站(2级)却未停靠途经的6号火车站(亦为2级)而不满足要求。

# Format
## Input
第一行包含2个正整数n, m,用一个空格隔开。
第i+ 1行(1 ≤ i≤ m)中
首先是一个正整数si(2 ≤ si≤ n),表示第i趟车次有si个停靠站;
接下来有si个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。
1 ≤ n, m ≤ 1000
## Output
输出只有一行,包含一个正整数,即n个火车站最少划分的级别数
# Samples
```input1
9 2
4 1 3 5 6
3 3 5 6
```
```output1
2
```
```input2
9 3
4 1 3 5 6
3 3 5 6
3 1 5 9
```
```output2
3
```
# Limitation
1s, 1024KiB for each test case..
Sol:
因为停靠站的级别要大于非停靠站的。
于是可以建立出大小关系来
于是topsort下就出来了。
例如样例2,图如下:

不断找出出度为0的点,然后去点去边。算出来等级为3
#include<iostream>
#include<cstdio>
#include<cstring>
#define ZYS 1005
using namespace std;
int n,m,ans,st[ZYS],s,tuopu[ZYS][ZYS],de[ZYS],tt[ZYS],top;
bool is[ZYS],bo[ZYS];
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
memset(is,0,sizeof(is));//is表示是否是停靠站
scanf("%d",&s);//第i个火车停靠了s个站
for(int j=1;j<=s;j++)
scanf("%d",&st[j]),is[st[j]]=true;
for(int j=st[1];j<=st[s];j++) //从出发站到结束站
if(!is[j]) //j这个站没有停靠
for(int k=1;k<=s;k++)
//停靠的站
if(!tuopu[j][st[k]])
//大小关系只要确定一次就好了
tuopu[j][st[k]]=1,de[st[k]]++;
//tuopu[i][j]表示j>i的级别
}
while (true)
{
top=0;
for(int i=1;i<=n;i++)
if(de[i]==0&&!bo[i])
{
tt[++top]=i,bo[i]=true;
//开始将出度为0的点删掉
}
if (top==0)break;
ans++;
for(int i=1;i<=top;i++)
for(int j=1;j<=n;j++)
if(tuopu[tt[i]][j])
tuopu[tt[i]][j]=0,de[j]--;
//去边去点
}
printf("%d",ans);
return 0;
}

浙公网安备 33010602011771号