NOIP2013T4 车站分级
#include<cstdio> #include<vector> using namespace std; #define N 1005 vector<int> G[N]; int n,m,c,d,e,x=0,s[N],t[N],in[N],b[N]; char a[N][N]; int main(){ scanf("%d%d",&n,&m); while(m--){ scanf("%d",&c); for(int i=1;i<=c;i++)scanf("%d",&s[i]); d=0; for(int i=1;i<c;i++) for(int j=s[i]+1;j<=s[i+1]-1;j++)t[++d]=j; for(int i=1;i<=c;i++) for(int j=1;j<=d;j++) if(a[s[i]][t[j]]==0){ G[s[i]].push_back(t[j]); a[s[i]][t[j]]=1; in[t[j]]++; } } while(1){ int k=0; for(int i=1;i<=n;i++) if(in[i]==0){b[++k]=i; in[i]=1;} if(k==0)break; x++; for(int i=1;i<=k;i++) for(int j=0;j<G[b[i]].size();j++) in[G[b[i]][j]]--; } printf("%d\n",x); return 0; }
#include<cstdio> #include<vector> #include<queue> using namespace std; #define N 1005 vector<int> G[N]; queue<int> Q; int n,m,c,d,e,x=1,s[N],t[N],in[N],lv[N]; char a[N][N]; int main(){ scanf("%d%d",&n,&m); while(m--){ scanf("%d",&c); for(int i=1;i<=c;i++)scanf("%d",&s[i]); d=0; for(int i=1;i<c;i++) for(int j=s[i]+1;j<=s[i+1]-1;j++)t[++d]=j; for(int i=1;i<=c;i++) for(int j=1;j<=d;j++) if(a[s[i]][t[j]]==0){ G[s[i]].push_back(t[j]); a[s[i]][t[j]]=1; in[t[j]]++; } } for(int i=1;i<=n;i++) if(in[i]==0){Q.push(i); lv[i]=1;} while(!Q.empty()){ e=Q.front(); Q.pop(); for(int i=0;i<G[e].size();i++) if(--in[G[e][i]]==0){Q.push(G[e][i]); x=lv[G[e][i]]=lv[e]+1; } } printf("%d\n",x); return 0; }
//建图也能超时?
#include<cstdio> #include<vector> #include<queue> using namespace std; #define N 1005 vector<int> G[N]; queue<int> Q; int n,m,c,d,e,x=1,s[N],t[N],in[N],lv[N]; bool find(int u,int v){ for(int i=0;i<G[u].size();++i) if(G[u][i]==v)return true; return false; } int main(){ scanf("%d%d",&n,&m); while(m--){ scanf("%d",&c); for(int i=1;i<=c;i++)scanf("%d",&s[i]); d=0; for(int i=1;i<c;i++) for(int j=s[i]+1;j<=s[i+1]-1;j++)t[++d]=j; for(int i=1;i<=c;i++) for(int j=1;j<=d;j++) if(!find(s[i],t[j])){G[s[i]].push_back(t[j]); in[t[j]]++;} } for(int i=1;i<=n;i++) if(in[i]==0){Q.push(i); lv[i]=1;} while(!Q.empty()){ e=Q.front(); Q.pop(); for(int i=0;i<G[e].size();i++) if(--in[G[e][i]]==0){Q.push(G[e][i]); x=lv[G[e][i]]=lv[e]+1; } } printf("%d\n",x); return 0; }
var s,t,i,j,k,l,m,n,s2,ans,ss:longint; a,x:array[0..1020,0..1020]of longint; d,Q,t1,t2,lv:array[0..1020]of longint; bo:boolean; begin readln(n,m); for i:=1 to m do begin read(s); for j:=1 to s do read(t1[j]); s2:=0; for j:=1 to s-1 do for k:=t1[j]+1 to t1[j+1]-1 do begin inc(s2);t2[s2]:=k; end; for j:=1 to s do for k:=1 to s2 do a[t1[j],t2[k]]:=1; end; for i:=1 to n do for j:=1 to n do if a[i,j]=1 then begin inc(d[j]); inc(x[i,0]); x[i,x[i,0]]:=j; end; s:=0; t:=0; for i:=1 to n do if d[i]=0 then begin Q[s]:=i; inc(s); end; while(s>t) do begin for i:=1 to x[Q[t],0] do begin dec(d[x[Q[t],i]]); if d[x[Q[t],i]]=0 then begin Q[s]:=x[Q[t],i]; lv[Q[s]]:=lv[Q[t]]+1; inc(s); end; end; inc(t); end; writeln(lv[Q[t-1]]+1); end.