luogu1983【2013普及】车站分级(拓扑排序)

来源:互联网 发布:excel数据的分类汇总 编辑:程序博客网 时间:2024/04/27 23:51

每一趟列车,没停靠的站的分级一定比停靠了的小,我们从停靠的站向没停靠的站建一条有向边,显然是个DAG,我们进行拓扑排序,看分成几个阶段(把栈内所有上次的点都删掉算一次。)。就是答案。

#include <bits/stdc++.h>using namespace std;#define N 1010#define inf 0x3f3f3f3f#define ll long longinline 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;}
阅读全文
0 0
原创粉丝点击