题目:
题解:
一开始以为是并查集,后来发现他们有互相关联.........拓扑,后来手残写错个地方,改改改......后来发现如果偷懒不判重边的话会RE,改改改.....
好吧还是水题的本性
代码:
#include <cstdio>
#include <cstring>
using namespace std;
int b[1005],al[1005][1005],in[1005];bool c[1005],d[1005],f[1005][1005];
int main()
{
int n,m,i,j,x,a,k;
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
memset(c,0,sizeof(c));
scanf("%d",&x);
for (j=1;j<=x;j++)
{
scanf("%d",&b[j]);
c[b[j]]=true;
}
for (j=b[1];j<=b[x];j++)
if (!c[j])
for (k=1;k<=x;k++)
if (!f[b[k]][j])
{
al[b[k]][++al[b[k]][0]]=j;
f[b[k]][j]=true;in[j]++;
}
}
int N=n;int ans=0;
memset(c,0,sizeof(c));
while (N)
{
memset(d,0,sizeof(d));
for (i=1;i<=n;i++)
if (!c[i] && in[i]==0 && !d[i])
{
N--,c[i]=true;
for (j=1;j<=al[i][0];j++)
{
in[al[i][j]]--;
if (!in[al[i][j]]) d[al[i][j]]=true;
}
}
ans++;
}
printf("%d",ans);
}