记录编号 154809 评测结果 AAAAAAAAAA
题目名称 [NOIP 2013]车站分级 最终得分 100
用户昵称 Gravataryun 是否通过 通过
代码语言 C++ 运行时间 0.353 s
提交时间 2015-03-25 09:21:13 内存使用 1.28 MiB
显示代码纯文本
#include<fstream>
#include<cstring>
#include<queue>
using namespace std;
ifstream fin("level2013.in");
ofstream fout("level2013.out");
const int SIZE=1001;
bool map[SIZE][SIZE],a[SIZE];//a用来记录哪些没有经过,b记录所有经过的点 
int n,m,degree[SIZE],b[SIZE];

int main(){
    fin>>n>>m;
    //输入,并建立图
    int si,ti,co;
    for(int i=1;i<=m;i++){        
        fin>>si;
        co=0;
        memset(a,0,sizeof(a));
        //输入si个数,记录哪些有,哪些没有
        for(int j=1;j<=si;j++){             
            fin>>ti;
            b[++co]=ti;
            a[ti]=1;
        }
        //开始建立图,所有没有经过的,都要向所有经过的建一条边 
        for(int j=b[1];j<=b[co];j++){
            if(!a[j]){
                for(int p=1;p<=co;p++) 
                    if(!map[j][b[p]]){map[j][b[p]]=1;degree[b[p]]++;}
            }
        } 
    }
    //将所有入度为0的点放到一个栈里面
    queue<int> q;
    for(int i=1;i<=n;i++){
        if(!degree[i]) q.push(i);
    } 
    //开始进行拓扑排序,找到最长路径 
    int ans=0;
    while(!q.empty()){
        si=q.size();
        ans++;
        for(int i=1;i<=si;i++){
            ti=q.front();
            q.pop();
            //将所有相连的边去掉 
            for(int j=1;j<=n;j++){
                if(map[ti][j]){
                    degree[j]--;
                    if(degree[j]==0) q.push(j);
                }
            }            
        }
    }
    fout<<ans<<endl;
    return 0;
}