luogu1983【2013普及】車站分級(拓撲排序)
阿新 • • 發佈:2019-01-27
每一趟列車,沒停靠的站的分級一定比停靠了的小,我們從停靠的站向沒停靠的站建一條有向邊,顯然是個DAG,我們進行拓撲排序,看分成幾個階段(把棧內所有上次的點都刪掉算一次。)。就是答案。
#include <bits/stdc++.h>
using namespace std;
#define N 1010
#define inf 0x3f3f3f3f
#define ll long long
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,h[N],num=0,a[N],ans=0,into[N],q[N],top=0;
bool g[N][N];
bool f[N];
void Topology_Sort(){
memset(f,0,sizeof(f));
while(1){
top=0;
for(int i=1;i<=n;++i)
if(!into[i]&&!f[i]) q[++top]=i,f[i]=1 ;
if(!top) break;ans++;
for(int i=1;i<=top;++i)
for(int y=1;y<=n;++y)
if(g[q[i]][y]) into[y]--,g[q[i]][y]=0;
}
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();
while(m--){
int nn=read();memset(f,0,sizeof(f));
for (int i=1;i<=nn;++i) a[i]=read(),f[a[i]]=1;
for(int j=a[1];j<=a[nn];++j)
if(!f[j])
for(int i=1;i<=nn;++i)
if(!g[a[i]][j])
g[a[i]][j]=1,into[j]++;
}
Topology_Sort();
printf("%d\n",ans);
return 0;
}