noip车站分级 拓扑排序
这道题呢 每次输入一段数就把1~n里面没有在这组数里面的数和他们连一波 表示这些数比他们等级低 然后就搞一搞就好了哇
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=3507; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int f[M][M],cnt; int in[M],x,n,m,v,sum[M]; int head,tail,ans=1,q[M],num[M]; int main() { n=read(); m=read(); while(m--){ v=read(); cnt++; for(int i=1;i<=v;i++) q[i]=read(),sum[q[i]]=cnt; for(int i=q[1];i<=q[v];i++)if(sum[i]!=cnt){ for(int k=1;k<=v;k++) if(!f[i][q[k]]) f[i][q[k]]=1,in[q[k]]++; } } for(int i=1;i<=n;i++) if(!in[i]) q[tail++]=i,num[i]++; while(head!=tail){ int x=q[head++]; if(head>M) head=0; for(int i=1;i<=n;i++) if(f[x][i]){ in[i]--; if(!in[i]) {q[tail++]=i; num[i]=num[x]+1;} } } for(int i=1;i<=n;i++) ans=max(ans,num[i]); printf("%d\n",ans); return 0; }