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.

 

posted @ 2014-10-23 12:40  qilinart  阅读(349)  评论(0编辑  收藏  举报