A.求缩点后入度为零的点的个数
B.求缩点后max{入度为零的点的个数,出度为零的点的个数}
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#define ll long long
using namespace std;
const int maxn=120000;
int head[maxn],net[2*maxn],to[2*maxn],cnt;
int dfn[maxn],low[maxn],c[maxn],s[maxn],col,num,top;
bool f[maxn];
int from[2*maxn];
int r[maxn],cd[maxn];
void add(int x,int y)
{
cnt++;
from[cnt]=x;
to[cnt]=y;
net[cnt]=head[x];
head[x]=cnt;
}
void dfs(int x)
{
dfn[x]=++num;
low[x]=num;
f[x]=1;
s[++top]=x;
for(int i=head[x];i;i=net[i])
{
int tmp=to[i];
if(dfn[tmp]==0)
{
dfs(tmp);
low[x]=min(low[x],low[tmp]);
}
else
if(f[tmp]==1)
{
low[x]=min(low[x],dfn[tmp]);
}
}
if(low[x]==dfn[x])
{
f[x]=0;
c[x]=++col;
while(s[top]!=x)
{
c[s[top]]=col;
f[s[top]]=0;
top--;
}
top--;
}
}
int main()
{
int n;
scanf("%d",&n);
int k=0;
for(int i=1;i<=n;i++)
{
int x=1;
while(1)
{
scanf("%d",&x);
if(!x) break;
add(i,x);
}
}
for(int i=1;i<=n;i++)
if(!dfn[i]) dfs(i);
bool flag=0;
for(int i=1;i<=cnt;i++)
{
if(c[from[i]]!=c[to[i]])
{
r[c[to[i]]]++;
cd[c[from[i]]]++;
flag=1;
}
}
int ans1=0,ans2=0;
if(flag)
{
for(int i=1;i<=col;i++)
{
if(!r[i]) ans1++;
if(!cd[i]) ans2++;
}
printf("%d\n%d",ans1,max(ans1,ans2));
}
else printf("1\n0");
return 0;
}