1. 程式人生 > >luogu1983【2013普及】車站分級(拓撲排序)

luogu1983【2013普及】車站分級(拓撲排序)

每一趟列車,沒停靠的站的分級一定比停靠了的小,我們從停靠的站向沒停靠的站建一條有向邊,顯然是個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; }