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