车站等级


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

  

posted @ 2021-10-01 11:37  我微笑不代表我快乐  阅读(6)  评论(0)    收藏  举报