其他分享
首页 > 其他分享> > luogu P1983 [NOIP2013 普及组] 车站分级

luogu P1983 [NOIP2013 普及组] 车站分级

作者:互联网

添加链接描述

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;//我还是小瞧了1000*1000的点可以构成的边0.0
int n,m;
int e[N],ne[N],h[N],idx,d[N];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    d[b]++;
}
int step[N],mx=0;
int bfs()
{

    queue<int>q;
    for(int i=1;i<=n;i++)
    {
        //cout<<i<<"---"<<d[i]<<endl;
        if(!d[i])q.push(i), step[i]=1;
    }
    while(q.size())
    {
        int x=q.front();
        q.pop();
        for(int i=h[x];i!=-1;i=ne[i]){
            int j=e[i];
            d[j]--;
            if(d[j]==0)
            {
                q.push(j);
                step[j]=step[x]+1;
                mx=max(mx,step[j]);
            }
        }
    }
    return mx;
}
bool vis[1010][1010];
int main()
{
    memset(h,-1,sizeof h);
    int flag[1010],arr[1010];
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        memset(arr,0,sizeof(arr));
        memset(flag,0,sizeof flag);
        int k;
        scanf("%d",&k);
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&arr[j]);
            flag[arr[j]]=1;
        }
        //
        for(int j=arr[1]+1;j<=arr[k];j++)
        {
            if(flag[j]==0)
            for(int c=1;c<=k;c++)
            {
                if(vis[j][arr[c]]==0)
                {
                    vis[j][arr[c]]=1;
                    add(j,arr[c]);
                }

            }
        }
    }
    cout<<bfs()<<endl;
    return 0;
}

标签:arr,NOIP2013,idx,int,luogu,step,flag,P1983,1010
来源: https://blog.csdn.net/Minelois/article/details/116721174